我正在尝试创建导航标签(取自Twitter Bootstrap):
<ul class="nav nav-tabs">
<li class="active"><a href="#">Home</a></li>
<li><a href="#">Profile</a></li>
<li><a href="#">Messages</a></li>
</ul>
活动标签标有class="active"
。
http://jsfiddle.net/schawaska/pfbva/有一个很好的静态导航栏和路由器/插座功能示例,但是 我无法理解如何创建动态导航栏/菜单/标签视图。
据我了解,可以在每个菜单项中使用类绑定:
classNameBindings: ['isActive:active']
但是在哪里切换isActive属性的正确位置?
答案 0 :(得分:154)
Ember 1.11 +:
{{#link-to "dashboard" tagName="li"}}
<a href="{{view.href}}">Dashboard</a>
{{/link-to}}
Ember&lt; 1.11(需要bind-attr
):
{{#link-to "dashboard" tagName="li"}}
<a {{bind-attr href="view.href"}}>Dashboard</a>
{{/link-to}}
答案 1 :(得分:26)
如果你使用Ember&gt; = 1.11,那么下面的https://stackoverflow.com/a/14501021/65542就是正确答案。
我会创建NavigationView
,请参阅http://jsfiddle.net/pangratz666/z8ssG/:
<强>车把强>:
<script type="text/x-handlebars" data-template-name="navigation">
<ul class="nav nav-tabs">
{{#view view.NavItemView item="home" }}
<a {{action gotoHome}} >Home</a>
{{/view}}
{{#view view.NavItemView item="profiles" }}
<a {{action gotoProfiles}} >Profiles</a>
{{/view}}
{{#view view.NavItemView item="messages" }}
<a {{action gotoMessages}} >Messages</a>
{{/view}}
</ul>
</script>
<强>的JavaScript 强>:
App.NavigationView = Em.View.extend({
templateName: 'navigation',
selectedBinding: 'controller.selected',
NavItemView: Ember.View.extend({
tagName: 'li',
classNameBindings: 'isActive:active'.w(),
isActive: function() {
return this.get('item') === this.get('parentView.selected');
}.property('item', 'parentView.selected').cacheable()
})
});
在您的路线connectOutlets
内,您必须通过router.set('navigationController.selected', 'home');
设置当前导航项...
另请查看ember-bootstrap存储库,它包含了Ember.js中的这个以及Bootstrap的更多功能
答案 2 :(得分:17)
上述一些建议对于twitter bootstrap案例仍然有效。你也可以试试这样的东西
{{#link-to 'dashboard' tagName='li'}}
{{#link-to 'dashboard'}}Link Title{{/link-to}}
{{/link-to}}
link-to
li
tagName将活动类应用于li link-to
将是anchor
元素,在右键单击时为您提供Open in New Tab
功能答案 3 :(得分:10)
最近有一个Ember-cli插件可以做到这一点。它被称为ember-cli-active-link-wrapper。
安装:ember install ember-cli-active-link-wrapper
你可以像这样使用它:
{{#active-link}}
{{link-to "Index" "index"}}
{{/active-link}}
导致:
<li class='active'>
<a href="/" class='active'>Index</a>
</li>
答案 4 :(得分:7)
我知道这是旧帖子,但这里有 Ember 2.4.0的更新
要创建链接,您可以写
List
或
adapter.insert()
当前路线与链接的路线匹配时,Ember会自动将类设置为活动状态(在此示例中为{{#link-to 'photoGallery'}}
Great Hamster Photos
{{/link-to}}
)。
如果您想在其他路线上控制“有效”课程,也可以通过设置{{link-to 'Great Hamster Photos' 'photoGallery'}}
属性来实现。
photoGallery
此链接在current-when
和{{#link-to 'photoGallery' current-when='photoGallery photoPreview'}}
Great Hamster Photos
{{/link-to}}
路线上都有active
课程。
答案 5 :(得分:4)
车把
<ul class="nav">
<li>{{#linkTo "index"}}Index{{/linkTo}}</li>
<li>{{#linkTo "about"}}About{{/linkTo}}</li>
</ul>
的Javascript
App.Router.map(function() {
this.route("about");
});
它将根据路线自动添加活动类。 注意:使用ember-1.0.0-pre.4.js
进行测试答案 6 :(得分:3)
您还可以将isActive方法更改为以下内容:
isActive: function() {
return App.getPath('router.currentState.path') === "root.firms";
}.property("App.router.currentState"),
或
isActive: function() {
return this.get('controller.target.currentState.path') === "root.firms";
}.property("controller.target.currentState"),
答案 7 :(得分:3)
我看到这个问题很老了,但是如果你将Ember.js升级到RC3,你可以使用tagName
属性,例如:
{{#link-to messages tagName="li"}}Messages{{/link-to}}
答案 8 :(得分:1)
不确定它是否非常动态,但尝试在http://codebrief.com/2012/07/anatomy-of-an-ember-dot-js-app-part-i-redux-routing-and-outlets/处查看解决方案 主要想法是检查您的应用的状态
<强> JavaScript的:强>
function stateFlag(name) {
return Ember.computed(function() {
var state = App.router.currentState;
while(state) {
if(state.name === name) return true;
state = state.get('parentState');
}
return false;
}).property('App.router.currentState');
}
ApplicationController: Ember.Controller.extend({
isHome: stateFlag('home'),
isSections: stateFlag('sections'),
isItems: stateFlag('items')
})
<强>车把:强>
<li class="home" {{bindAttr class="isHome:active"}}>
</li>
<li class="sections" {{bindAttr class="isSections:active"}}>
</li>
<li class="items" {{bindAttr class="isItems:active"}}>
</li>
<强>更新强> pangratz的解决方案看起来更漂亮
答案 9 :(得分:1)
这是一个完整的解决方案:
查看:
App.NavView = Ember.View.extend({
tagName: 'li',
classNameBindings: ['active'],
active: function() {
return this.get('childViews.firstObject.active');
}.property()
});
模板:
<ul>
{{#each item in controller}}
{{#view App.NavView}}
{{#linkTo "item" item tagName="li"}}
<a {{bindAttr href="view.href"}}>
{{ item.name }}
</a>
{{/linkTo}}
{{/view}}
{{/each}}
</ul>
答案 10 :(得分:0)
迟早想要更改状态的命名或者你必须通过代码和视图的任何内容,同时添加一个函数来转换到每个路径似乎都不可取。 我的方法有点程序化和模块化:
# Parent View-Tamplate, holding the navbar DOM elements
App.NavView = Ember.View.extend(
controller: App.NavArrayController
templateName: "ember-nav"
)
# We push NavItems into this array
App.NavArrayController = Ember.ArrayController.create(
content: Ember.A([])
)
# NavItem has two settable properties and
# an programmatic active state depending on the router
App.NavItem = Ember.Object.extend(
title: ''
goto: null # <=this is the name of the state we want to go to!
active: (->
if App.router.currentState.name == @.get "goto"
true
else
false
).property('App.router.currentState.name').cacheable()
)
# the actual NavElement which gets the class="active" if the
# property "active" is true, plus a on-click binding to
# make the Router transition to this state
App.NavItemView = Ember.View.extend(
tagName: "li"
classNameBindings: ["active"]
click: ->
App.router.transitionTo(@get('goto'))
false
)
nav-view.hbs(用于twitter-bootstrap-style navs)
<div class="nav-collapse collapse">
<ul class="nav">
{{#each App.NavArrayController}}
{{#view App.NavItemView classBinding="active" gotoBinding="goto"}}
<a href="#" {{bindAttr data-goto="goto"}}> {{title}}</a>
{{/view}}
{{/each}}
</ul>
</div>
这样,我可以在路由器中创建并弄乱我的路由, 并保持Nav-Definitions并排:
# put this somewhere close to the Router
App.NavArrayController.pushObjects(
[
App.NavItem.create(
title: 'Home'
goto: 'home'
),
App.NavItem.create(
title: 'Chat'
goto: 'chat'
),
App.NavItem.create(
title: 'Test'
goto: 'test'
)
]
)
答案 11 :(得分:0)
baijum上面的回答大多是正确的,但在最新版本的Ember中,“bind-attr”已被弃用。以下是编写它的新方法:
{{#link-to "dashboard" tagName="li"}}
<a href="{{view.href}}">Dashboard</a>
{{/link-to}}
正如你所看到的,它更容易,有点像魔法......
答案 12 :(得分:0)
从v0.8.0开始ember-bootstrap支持导航,包括正确处理活动状态。并且没有任何link-to / tagName类型的黑客攻击:
{{#bs-nav type="pills"}}
{{#bs-nav-item}}
{{#link-to "foo"}}Foo{{/link-to}}
{{/bs-nav-item}}
{{#bs-nav-item}}
{{#link-to "bar"}}Bar{{/link-to}}
{{/bs-nav-item}}
{{/bs-nav}}
请参阅http://kaliber5.github.io/ember-bootstrap/api/classes/Components.Nav.html
答案 13 :(得分:0)
此处提出的许多解决方案不适用于任何最近的Ember版本(例如,视图被弃用)。此外,仅使用link-to
帮助程序无法解决问题,因为bootstrap期望active
类出现在<li>
而不是<a>
!
因此,我将尝试总结迄今为止实际工作的解决方案:
插件为这个特殊用例提供了一个组件:
<ul class="nav nav-tabs">
{{#active-link}}
{{#link-to "foo"}}Foo{{/link-to}}
{{/active-link}}
{{#active-link}}
{{#link-to "bar"}}Bar{{/link-to}}
{{/active-link}}
</ul>
取自https://stackoverflow.com/a/29939821/5556104
ember-bootstrap提供了许多将引导程序功能集成到您的ember应用程序中的组件,其中包括导航组件:
{{#bs-nav type="tabs"}}
{{#bs-nav-item}}
{{#link-to "foo"}}Foo{{/link-to}}
{{/bs-nav-item}}
{{#bs-nav-item}}
{{#link-to "bar"}}Bar{{/link-to}}
{{/bs-nav-item}}
{{/bs-nav}}
取自https://stackoverflow.com/a/38279975/5556104
有点hacky,但应该没有任何额外的插件工作:
<ul class="nav nav-tabs">
{{#link-to "foo" tagName="li"}}
{{#link-to "foo"}}Foo{{/link-to}}
{{/link-to}}
{{#link-to "bar" tagName="li"}}
{{#link-to "bar"}}Bar{{/link-to}}
{{/link-to}}
</ul>
答案 14 :(得分:0)
与其他人说的一样,使用{{#link-to}}
链接到现有route
,当该路由是当前网址时,{{#link-to}}
会自动将active
添加到其CSS类中。