emberjs - 如何使用路由器基础设施标记活动菜单项

cox*_*oxx 51 ember.js ember-old-router

我正在尝试创建导航标签(取自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>
Run Code Online (Sandbox Code Playgroud)

活动选项卡标有class="active".

http://jsfiddle.net/schawaska/pfbva/上有静态导航栏和路由器/插座功能的很好的例子,但我无法理解如何创建动态导航栏/菜单/选项卡视图.

据我了解,可以在每个菜单项中使用类绑定:

 classNameBindings: ['isActive:active']
Run Code Online (Sandbox Code Playgroud)

但是在哪里切换isActive属性的正确位置?

les*_*syk 154

Ember 1.11+:

{{#link-to "dashboard" tagName="li"}}
  <a href="{{view.href}}">Dashboard</a>
{{/link-to}}
Run Code Online (Sandbox Code Playgroud)

Ember <1.11(bind-attr必填):

{{#link-to "dashboard" tagName="li"}}
  <a {{bind-attr href="view.href"}}>Dashboard</a>
{{/link-to}}
Run Code Online (Sandbox Code Playgroud)

  • 这需要是公认的答案.我只花了10分钟试图在<li>标签上获取`bindAttr`以按名称引用view.href,直到我发现这一点并意识到我已将它全部倒退. (18认同)
  • 这绝对是最简单的方法 (7认同)
  • 你需要在链接元素上显式地将光标设置为指针:`a {cursor:pointer;}`参见http://marceldegraaf.net/2013/05/17/ember-js-and-bootstrap -navbar标志丽active.html (5认同)
  • 这绝对是最简单的方法!应该是接受的答案. (4认同)
  • 绝对是我从小组中发现的最佳答案. (3认同)
  • 在我插入这个奇怪的东西之后,我的代码是如何才能知道它会在li中插入一个"主动"类?很不清楚. (3认同)
  • AFAIK这个解决方案将不再起作用,因为`href`不会为非'a`标签生成:http://discuss.emberjs.com/t/tagname-and-html-best-practices/4260/3 (3认同)

pan*_*atz 26

如果您使用Ember> = 1.11,则下面的/sf/answers/1015071501/是正确的答案.


我会创建一个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>
Run Code Online (Sandbox Code Playgroud)

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()
    })
});
Run Code Online (Sandbox Code Playgroud)

在您的路线内,您connectOutlets必须通过router.set('navigationController.selected', 'home');... 设置当前导航项目


另外看一下ember-bootstrap存储库,它将这个以及Bootstrap的更多功能包装在Ember.js中

  • FWIW,我更新了pangratz的例子,如图所示[jsfiddle](http://jsfiddle.net/bazzel/ydn9r/) (4认同)
  • 你能更新你的答案以反映新路由器的变化吗?查看http://stackoverflow.com/questions/14328295/how-do-i-bind-to-the-active-class-of-a-link-using-the-new-ember-router. (2认同)
  • 非常感谢@pangratz.你是摇滚明星. (2认同)

sel*_*gsz 17

上述一些建议对于twitter bootstrap案例仍然有效.你也可以试试这样的东西

{{#link-to 'dashboard' tagName='li'}} 
  {{#link-to 'dashboard'}}Link Title{{/link-to}}
{{/link-to}}
Run Code Online (Sandbox Code Playgroud)
  1. link-toli标记名的活动类适用于丽
  2. 内部link-to将是一个在右键单击时anchor为您提供Open in New Tab功能的元素


Wil*_*Wit 10

最近有一个Ember-cli插件可以做到这一点.它被称为ember-cli-active-link-wrapper.

安装: ember install ember-cli-active-link-wrapper

你可以像这样使用它:

{{#active-link}}
  {{link-to "Index" "index"}}
{{/active-link}}
Run Code Online (Sandbox Code Playgroud)

这导致:

<li class='active'>
    <a href="/" class='active'>Index</a>
</li>
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.所有较高层次的投票都在现代的Ember或其他方面无法维持. (3认同)

Iva*_*vic 7

我知道这是旧帖子,但这里是Ember 2.4.0的更新

要创建链接,您可以编写

{{#link-to 'photoGallery'}}
  Great Hamster Photos
{{/link-to}}
Run Code Online (Sandbox Code Playgroud)

要么

{{link-to 'Great Hamster Photos' 'photoGallery'}}
Run Code Online (Sandbox Code Playgroud)

当前路线与链路的路线匹配时,Ember会自动将类设置为活动(在本例中photoGallery).

如果你想在其他路线上控制'active'类,你可以通过设置current-when属性来实现.

{{#link-to 'photoGallery' current-when='photoGallery photoPreview'}}
  Great Hamster Photos
{{/link-to}}
Run Code Online (Sandbox Code Playgroud)

此链接将active在两个路由photoGalleryphotoPreview路由上都有类.

https://github.com/emberjs/ember.js/blob/v2.4.0/packages/ember-routing-views/lib/components/link-to.js#L140