I have a list and I'd like to set one item as class="active" automatically. Given the following bootstrap code:
<ul class="nav">
<li {{bindAttr class="atIndex:active"}}>{{#linkTo "index"}}Index{{/linkTo}}</li>
<li {{bindAttr class="atAbout:active"}}>{{#linkTo "about"}}About{{/linkTo}}</li>
<li {{bindAttr class="atLogin:active"}}>{{#linkTo "login"}}Login{{/linkTo}}</li>
</ul>
atIndex, atAbout and atLogin reside in my ApplicationController.
To render as:
<ul class="nav">
<li class="active"><a...>Index{{/linkTo}}</li>
<li><a...>About<a></li>
<li><a...>Login<a></li>
</ul>
What's the best way to do this with Ember 1.0 pre4? I'd rather not add special code to every view or controller.
PS - atIndex: true
works, but atIndex: function() {return true; }.property().volatile()
does not. Which makes me think I'm doing something wrong.
Thank you!
Just nest the {{link-to}} with a tagName on the outer one. I'm doing this on EmberJS 2.0.
I solved a similar problem by creating a view for each item and using
classNameBindings
(I have to say that i don't have a HTML list, i.e.<a>...</a>
in my app, just list of<div>
).Here is the way it works for me:
In tasklist.handlebars i iterate over my custom view
Ember will insert a view (i. e.
<div>
) for each item.The view class for each item is defined in task_list_item_view.js as
Finally the template for the view just renders my link in tasklistitem.handlebars
AFAIK you have to specify the source data in the
property()
call to let ember know when to (re-) evaluate the property.Hope that helps
I went with:
});
I didn't want to use the accepted answer as I wanted to keep my li elements as plain old html. There might be a better way to check the active state but I couldn't get access to the right property.
A lot of these answers are outdated. Here is a much cleaner (and DRY) version for Bootstrap and Ember 2.x:
the active route's path is updated automatically in the
ApplicationController
viacurrentPath
so I did something like that in my App... InApplicationController
added properties like so:and in my
ApplicationView
template: