65

I'm working on the template for a directive. If a property in the scope is set to true, data-toggle="dropdown" should be appended to the element. If the variable is false, this data attribute should not render as an attribute of the element.

For example, if scope variable is true, the template should render:

<span data-toggle="dropdown"></span>

If false, the template should render:

<span></span>

What would the template look like to accomplish this?


For example, I know that I can use ng-class to conditionally include a class. If I want the template to render this:

<span class="dropdown"></span>

Then my template would look like this:

"<span ng-class="{ 'dropdown': isDropDown }"></span>

If scope variable isDropDown is false, then the template will simply render:

<span></span>

So there's a way in a template to conditionally add a class="dropdown". Is there a syntax for templates that allows me to conditionally add data-toggle="dropdown"?


One of the things I've tried for the template is:

"<span data-toggle="{ 'dropdown': isDropDown }"></span>

My thinking with the above template is that if the scope variable isDropDown is true, the value of data-toggle will be set to "dropdown". If isDropDown is false, then the value of data-toggle would simply be an empty string "". That doesn't seem to work though.

3
  • I'm a bit confused about what are you actually asking for. Do you want to know what the directive would look like? Commented Feb 26, 2014 at 18:27
  • I realize I've done a poor job of trying to articulate my question. I've updated it the hopes that it makes more sense. I don't have the angular vocabulary yet to make more sense. Commented Feb 26, 2014 at 18:34
  • 1
    Possible duplicate of What is the best way to conditionally apply attributes in Angular? Commented Jan 3, 2016 at 9:40

3 Answers 3

86

I think a good way could be to use ng-attr- followed by the expression you want to evaluate. In your case it would be something like:

<span ng-attr-data-toggle="{{ isValueTrue ? 'toggle' : 'notToggle' }}"></span>

Here's a fiddle with an example.

Sign up to request clarification or add additional context in comments.

5 Comments

@LittleBigBot I might be missing your point here. Can you provide any sample code to confirm that and better explain what you mean for "general attributes"/not working "for directives"?
I tested on some directives and even with isolate scope, replace and template it still works for me, see: jsfiddle.net/gleezer/hrdoyz04/1
Yeah, you need two attributes to do it correctly for directives. But this fiddle is what I mean, you can set the to be true, false, but it will always render the directive: jsfiddle.net/littlebigbot/9ym6nnck
There are two attributes on this div: <div my-var="{{myVar}}" my-directive>
ng-attr-myattribute="{{myCondition ? '' : undefined}}" In case you want to conditionally remove and add attribute (with empty attribute value), use this. Attribute is added if condition is true, attribute is removed if condition is false.
42

<span ng-attr-data-toggle="{{isTrue && 'dropdown' || undefined }}"></span>

will produce when isTrue=true : <span data-toggle="dropdown"></span>

and when isTrue=false : <span></span>

3 Comments

Thanks a lot... This works for me. I have got chance to solve my problem. It was <li ng-repeat="node in data" ui-tree-node ng-include="'nodes_renderer.html'" ng-attr-data-nodrag="{{node.shared_status == 0 && true || undefined }}"></li>
Has this behavior been changed in a particular version? It works for me. undefined removes the attribute. I'm using 1.5.5.
The docs for this are here: docs.angularjs.org/guide/interpolation
8

At the moment, there is no angular directive that allows you to remove or add an attribute conditionally. You can do ng-switch around the span, one with that attr and another one without it.

<div ng-switch on="condition">
<span data-toggle="dropdown" ng-switch-when="value"></span>
<span ng-switch-default></span>
</div>

or

<span data-toggle="dropdown" ng-if="expression"></span>
<span ng-if="!expression"></span>

You can also create a directive for that same purpose (adding/removing attrs conditionally) but that would be a bit more complicated.

Additionally if what you want is manage the scope variable inside the directive you can pass it as another attribute.

Example:

<span data-toggle="dropdown" when="isDropDown"></span>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.