2016-10-05 15 views
1

私は、ページ上のブロックセットを拡大して折り畳むための角度指示文を実装しています。このディレクティブは、パラメータとして「展開可能なアイテム」のセットを必要とし、そのすべてがプロパティisExpandedを持つ必要があります。Angularjsで計算された配列

<expand-collapse-all expandable-items="expandableItems"></expand-collapse-all> 

このような外観を拡張し、崩壊すべきブロック:問題は私のexpandableItemsは "計算された" でなければならないことである

_.forEach(groups, group => { 
    expandableItems.push(group.library); 
}); 

<ul> 
    <li ng-repeat="group in groups"> 
     <block items="group.items" library="group.library"></block> 
    </li> 
</ul> 

expandableItems配列は、このように形成されています。配列、isExpandedはライブラリのプロパティであり、グループではないので、グループを追加または削除することができ、私は手動で更新したくないからexpandableItemsは、グループが追加または削除されるたびに配列されます。

グループオブジェクトを展開可能にして(グループにオブジェクトを追加して)、グループ全体をブロックとディレクティブに渡してアイテムとライブラリを別々に渡すことで問題を解決できることがわかりました。しかし、私はまだそれが今のようなときにどのように解決できるのか、まだ不思議です。

私はknockoutjsでさらに理解しています。ノックアウトではexpandableItemsko.computedと定義することで簡単に達成できます。私はangularjsで私がどのように似たようなことをすることができるかはわかりません。どういうわけかexpand-collapse-allに関数を渡すことができますか。expandableItems配列を再計算しますか?

私はこれをやってみました:ページのコントローラのコンストラクタでgetExpandableItems(groups)を定義し、

<expand-collapse-all expandable-items="getExpandableItems(groups)"></expand-collapse-all> 

、私はエラー取得 "エラー:。!10 $ダイジェスト()の反復に達し中止を"

+0

同様の質問がありました。http://stackoverflow.com/questions/18242816/bind-an-angularjs-directive-to-a-mapping-of-an-array – Nat

答えて

1

計算された配列をキャッシュする必要があります。 Angularは参照の等しいかどうかをチェックしているため、チェックが失敗すると新しいダイジェストループが発生するため、毎回新しい配列インスタンスを返すことはできません。

関連する問題