2016-04-09 10 views
0

問題は2つのレベルのメニューがあることです。クリック後、各メニュー要素の第2レベルが表示されます。もう一度クリックすると、サブメニューは非表示になります。だから私は、最初のレベルのメニュー要素でCSSクラスを切り替えることでこれを行うことができると考えました。Emberはオブジェクトのプロパティを変更して動作します

Component.js - これまでのところ、2つのメインメニュー要素が必要です。

menus: [{ 
      'name': 'Dashboard', 
      'icon': 'dashboard', 
      'active': false, 
      submenus: [{ 
       ... 
      }] 
     }, 
     { 
      'name': 'Settings', 
      'icon': 'cloud', 
      'active': false, 
      submenus: [{ 
       ... 
      }], 
     } 
    ], 

私は動的にHTML要素を生成しています。私はクラスとアクティブなプロパティをバインドしているので、component.jsで変更された場合、CSSクラスに影響を与えるはずです。

{{#each menus as |menu|}} 
    <li class="collapsible" {{bind-attr class="menu.active:active"}} {{action 'toggle' menu}}> 
     <a ><span class="glyphicon glyphicon-{{menu.icon}}"></span>{{menu.name}}</a> 
     <ul> 
      {{#each menu.submenus as |submenu|}} 
       {{#link-to submenu.route activeClass="selected" tagName="li"}} 
        <a href=""><{{submenu.name}}</a> 
       {{/link-to}} 
      {{/each}} 
     </ul> 
    </li> 
{{/each}} 

だから、最後に私は、最初のレベルのメニューのアクティブパラメータを切り替えるためのシンプルなアクションを定義します。

actions: { 
    toggle: function(menu) { 
     this.toggleProperty(menu.active); 
    } 
} 

しかし、私は文字列として要素を指定していないと言います。 そして、それをmenu.toggleProperty('active')に変更すると、togglePropertyは関数ではないということになります。

私にアドバイスできますか?ありがとう

+0

どのバージョンのEmber.jsを使用していますか? 'bind-attr'は2.0より前です。 – locks

+0

'menu'はEmber.Objectではないので、' toggleProperty'メソッドは使用できません。 – locks

+0

Emberのバージョンは2.3.0です。 私はメニューをロギングするときにオブジェクトを正しく表示しますが、togglePropertyを実行しようとすると、それは関数ではないことを示します。 P.S - 編集ありがとう – Bob

答えて

1

menuEmber.Objectではないため、このエラーが発生していると思います。手動で行うことができます:

actions: { 
    toggle(menu) { 
    Ember.set(menu, 'active', !Ember.get(menu, 'active')); 
    } 
} 
+0

ありがとうございました!これはEmberではないのが普通ですか?Object? bind-attrが推奨されていないことを指摘してくれてありがとう:) – Bob

+0

はい、私はそう信じています。 Ember.jsはネイティブ拡張機能をオフにしていてもオブジェクトではない場合、Ember.Arrayで自動的に配列をラップするはずです。 – locks

関連する問題