40

リストがあり、1つのアイテムをclass="active"として自動的に設定したいと思います。次のブートストラップコードがあるとします。

<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、およびatLoginは私のApplicationControllerにあります。

次のようにレンダリングするには:

<ul class="nav">
<li class="active"><a...>Index{{/linkTo}}</li>
<li><a...>About<a></li>
<li><a...>Login<a></li>
</ul>

Ember 1.0 pre4でこれを行うための最良の方法は何ですか?すべてのビューまたはコントローラーに特別なコードを追加したくありません。

PS-atIndex: true動作しますが、atIndex: function() {return true; }.property().volatile()動作しません。それは私が何か間違ったことをしていると私に思わせます。

ありがとうございました!

4

12 に答える 12

75
{{#link-to "dashboard" tagName="li" href=false}}
  <a {{bind-attr href="view.href"}}>
    Dashboard
  </a>
{{/link-to}}
于 2013-01-24T12:07:57.250 に答える
14

これを解決する最もクリーンな方法は、linkToリンクをレンダリングするときにアクティブクラスを設定するためのヘルパーの組み込みサポートを利用することです。AFAIKこれは、ソースコード以外ではまだ文書化されていません。

実装:https ://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/helpers/link_to.js#L46

例:https ://github.com/emberjs/ember.js/blob/master/packages/ember/tests/helpers/link_to_test.js#L120

この機能を利用するには、li要素ではなくリンク上にアクティブなクラスがあることに基づいて、cssをスタイルに調整するだけです。本当にスタイルを設定する必要がある場合は、拡張して使用するliカスタムビューとヘルパーを作成できますが、cssの変更ははるかに簡単です。Ember.LinkViewli

- - アップデート - -

私たちは皆Twitterのブートストラップが大好きなので、CSSを変更するだけではおそらくそれほど素晴らしい選択肢ではありません。その場合、次の方法でうまくいきます。

App.ApplicationView = Ember.View.extend({
  currentPathDidChange: function() {
    Ember.run.next( this, function() {
      this.$("ul.nav li:has(>a.active)").addClass('active');
      this.$("ul.nav li:not(:has(>a.active))").removeClass('active');
    });
  }.observes('controller.currentPath')
});

ember linkを使用した実例ブートストラップピルを使用したヘルパー:http://jsbin.com/ekobod/5/edit ember-1.0.0-pre.4が必要)

于 2013-01-19T16:57:28.117 に答える
5

アクティブなルートのパスはApplicationControllerviaで自動的に更新されるcurrentPathので、アプリでそのようなことをしました...次のApplicationControllerような追加のプロパティで:

isProductsActive: function(){
  if ( this.get('currentPath') === 'products' ) return 'active';
  else return '';
}.property('currentPath')

そして私のApplicationViewテンプレートでは:

<li {{bindAttr class="isProductsActive"}}>
  {{#linkTo "products"}}Products{{/linkTo}}
</li>
于 2013-01-19T16:22:54.500 に答える
5

これを処理するember-cliアドオンを作成しました。

https://github.com/alexspeller/ember-cli-active-link-wrapper

于 2015-03-18T20:37:17.647 に答える
3

編集:最後に、リンクのember.jsを使用してブートストラップli要素のactivateクラスを使用するために私が見つけた最良の方法。

{{#linkTo "dives" tagName="li"}}
   <a {{bindAttr href="view.href"}}>Dives</a>
{{/linkTo}}

--------------8 <--------------

非推奨:

Ember.jsがlinkToヘルパーのactiveClass属性を導入する前は、以前の回答が適切だったと思います。今、私はこのような問題を解決します:

<ul class="nav">
<li >{{#linkTo "index" activeClass="active"}}Index{{/linkTo}}</li>
<li >{{#linkTo "about" activeClass="active}}About{{/linkTo}}</li>
<li >{{#linkTo "login" activeClass="active}}Login{{/linkTo}}</li>
</ul>

Enberは、必要に応じてクラスを自動的に追加します。

于 2013-09-28T03:36:05.040 に答える
2

ハンドルバーだけを必要とする別の解決策を提案する場合:

<li {{bind-attr class="view.innerLink.active:active"}}>
    {{#link-to "path" viewName="innerLink"}}Click{{/link-to}}
</li>

これにより、LinkViewオブジェクトが親ビューのメンバーとして設定されます。親ビューは、参照できるアクティブな属性です。

于 2014-04-18T11:39:38.797 に答える
2

リストグループ( http://getbootstrap.com/components/#list-group-linked )でリンクされたアイテムを使用する非常に単純なソリューションを見つけました。

<div class="list-group">
{{#each thing in list}}
    {{#link-to "details" thing.id tagName="a" href="view.href" class="list-group-item" {{thing.name}} {{/link-to}}
{{/each}}
</div>

Bootstrapv3.1.1およびEmberv1.7.0で動作します

于 2014-09-16T14:51:53.720 に答える
2

{{link-to}}を外側のtagNameにネストするだけです。私はEmberJS2.0でこれを行っています。

{{#link-to "admin.websocket" tagName="li"}}
    {{#link-to "admin.websocket"}}WebSocket{{/link-to}}
{{/link-to}}
于 2015-08-17T15:57:26.780 に答える
1

EmberでBootstrapナビゲーションを使用する場合は、次の機能をすぐにサポートするBootstrapforEmberを使用できます。

Github:https ://github.com/ember-addons/bootstrap-for-ember デモ:http ://ember-addons.github.io/bootstrap-for-ember/dist/#/show_components/tabs

于 2013-08-29T15:31:21.653 に答える
1

これらの答えの多くは時代遅れです。BootstrapとEmber2.xのよりクリーンな(そしてDRY)バージョンは次のとおりです。

{{#link-to "index" tagName="li" as |link|}}
  <a href="#" class="{{if link.active 'active'}}">Index Page</a>
{{/link-to}}
于 2016-04-07T12:06:50.787 に答える
0

アイテムごとにビューを作成して使用することで、同様の問題を解決しましたclassNameBindings(HTMLリストはありません。つまり<a>...</a>、アプリにはリストだけがあります<div>)。

これが私のために働く方法です:

tasklist.handlebarsで、カスタムビューを繰り返し処理します

  {{#each tasks}}
    {{view App.TaskListItemView contentBinding="this"....}}
  {{/each}}

Emberは<div>、各アイテムのビュー(つまり)を挿入します。

各アイテムのビュークラスは、task_list_item_view.jsで次のように定義されています。

App.TaskListItemView = Ember.View.extend({

  controller: null,
  classNameBindings: ['isSelected', 'isClosed'],

  isClosed: function() {
      var content = this.get('content');
      return content && !content.isOpen(new Date);
  }.property('controller.content.@each'),

  isSelected: function() {
      return (this.get('controller').isSelectedTask(this.get('content')));
  }.property('controller.taskSelection.@each'),

  ....
});

最後に、ビューのテンプレートは、tasklistitem.handlebarsにリンクをレンダリングするだけです。

<a {{action "selectTask" view.content target="view"}} rel="tooltip"
         {{bindAttr title="view.content.comment"}} class="taskListLink">
  ....
</a>

AFAIKでは、property()呼び出しでソースデータを指定して、プロパティを(再)評価するタイミングをemberに通知する必要があります。

お役に立てば幸い

于 2013-01-19T11:39:44.297 に答える
-1

私は一緒に行きました:

 Ember.LinkView.reopen({
didInsertElement:function(){

    if(this.$().hasClass('active')){

        this.$().parent().addClass('active');

    }
}

});

li要素を単純な古いhtmlのままにしておきたかったので、受け入れられた回答を使用したくありませんでした。アクティブな状態を確認するためのより良い方法があるかもしれませんが、適切なプロパティにアクセスできませんでした。

于 2015-01-07T21:31:34.027 に答える