Sunday, May 19, 2024
 Popular · Latest · Hot · Upcoming
193
rated 0 times [  197] [ 4]  / answers: 1 / hits: 159675  / 12 Years ago, sat, december 29, 2012, 12:00:00

I have an angular template which looks like this...



<div ng-repeat=message in data.messages ng-class=message.type>

<div class=info>
<div class=type></div>
<div class=from>From Avatar</div>
<div class=createdBy>Created By Avatar</div>
<div class=arrowTo>
<div class=arrow></div>
<div class=to>To Avatar</div>
</div>
<div class=date>
<div class=day>25</div>
<div class=month>Dec</div>
</div>
</div>

<div class=main>
<div class=content>
<div class=heading2>{{message.title}}</div>
<div ng-bind-html=message.content></div>
</div>

</div>

<br />
<hr />
<br />

</div>


I have set up a JSfiddle to show the data being bound.



What I need to do is make the from, to and arrowTo divs show conditionally, depending on the content of the data.



The log is is this...




  • If there is a from object in the data then show the from div and bind the data but don't show the createdBy div .

  • If there is no from object but there is a createdBy object then show the createdBy div and bind the data.

  • If there is a to object in the data then show the arrowTo div and bind it's data.



Or in plain English, if there is a from address, show it, otherwise show who created the record instead and if there is a to address then show that too.



I have looked into using ng-switch but I think I'd have to add extra markup which would leave an empty div if there was no data. Plus I'd need to nest switch directives and I'm not sure if that would work.



Any ideas?



UPDATE:



If I were to write my own directive (If I knew how!) then here is some pseudo code to show how I would want to use it...



<div ng-if=showFrom()>
From Template Goes Here
</div>
<div ng-if=showCreatedBy()>
CreatedBy Template Goes Here
</div>
<div ng-if=showTo()>
To Template Goes Here
</div>


Each of these would disappear if the function/expression evaluated to false.


More From » angularjs

 Answers
16

Angular 1.1.5 introduced the ng-if directive. That's the best solution for this particular problem. If you are using an older version of Angular, consider using angular-ui's ui-if directive.



If you arrived here looking for answers to the general question of conditional logic in templates also consider:








Original answer:



Here is a not-so-great ng-if directive:



myApp.directive('ngIf', function() {
return {
link: function(scope, element, attrs) {
if(scope.$eval(attrs.ngIf)) {
// remove '<div ng-if...></div>'
element.replaceWith(element.children())
} else {
element.replaceWith(' ')
}
}
}
});


that allows for this HTML syntax:



<div ng-repeat=message in data.messages ng-class=message.type>
<hr>
<div ng-if=showFrom(message)>
<div>From: {{message.from.name}}</div>
</div>
<div ng-if=showCreatedBy(message)>
<div>Created by: {{message.createdBy.name}}</div>
</div>
<div ng-if=showTo(message)>
<div>To: {{message.to.name}}</div>
</div>
</div>


Fiddle.



replaceWith() is used to remove unneeded content from the DOM.



Also, as I mentioned on Google+, ng-style can probably be used to conditionally load background images, should you want to use ng-show instead of a custom directive. (For the benefit of other readers, Jon stated on Google+: both methods use ng-show which I'm trying to avoid because it uses display:none and leaves extra markup in the DOM. This is a particular problem in this scenario because the hidden element will have a background image which will still be loaded in most browsers.).
See also How do I conditionally apply CSS styles in AngularJS?



The angular-ui ui-if directive watches for changes to the if condition/expression. Mine doesn't. So, while my simple implementation will update the view correctly if the model changes such that it only affects the template output, it won't update the view correctly if the condition/expression answer changes.



E.g., if the value of a from.name changes in the model, the view will update. But if you delete $scope.data.messages[0].from, the from name will be removed from the view, but the template will not be removed from the view because the if-condition/expression is not being watched.


[#81178] Thursday, December 27, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
jackelyn

Total Points: 303
Total Questions: 103
Total Answers: 102

Location: Turks and Caicos Islands
Member since Sun, Mar 7, 2021
3 Years ago
jackelyn questions
Thu, Apr 8, 21, 00:00, 3 Years ago
Sun, Feb 28, 21, 00:00, 3 Years ago
Mon, May 25, 20, 00:00, 4 Years ago
Thu, Apr 30, 20, 00:00, 4 Years ago
;