2016-10-16 9 views
1

データのリストをソートして変更を反映しようとしていますが、サブコンポーネントを使用してコンテンツをレンダリングすると、Mithril.js:ビューでサブコンポーネントが使用されている場合にソートデータが再レンダリングされない

私のソート機能は、単にボタンのonclickのによって呼び出されている:

m('button', {onclick: ctrl.sort}, 'sort'), 

は、ここに私の問題を複製jsfiddleです。最初のバージョンは、サブコンポーネントを使用してレンダリングします。 https://jsfiddle.net/4trL6y22/

ctrl.names.map(function(name){ 
    return m(Hello, {who: name}); 
}) 

コードはサブコンポーネントなしで書き換えた場合、ソートが発生した後、ビューが更新されます: https://jsfiddle.net/4trL6y22/1/

ctrl.names.map(function(name){ 
    return m('h1', name); 
}) 

(私の実際のケースは、サブコンポーネントを持つから、より複雑と利点であります)。この種の差異をページに吹き込むために私は何が欠けていますか?

答えて

2

を設定することができれば、私はあなたを考えてわからないんだけどコントローラー機能の実行方法を誤解しています。

コントローラは、コンポーネントが作成されたときに一度実行されますが、後続の差分では実行されません。 keyが変更されたとき(一般的には、このステートメントの例外を含みます)

したがって、options.whoをビューに直接入力することは、コンポーネントのコントローラに設定する方が好ましいなぜ私はそれが望ましいと信じているのですか?つまり、状態はより少ない場所で維持されます)、問題の1つが修正されます。

他の問題は、上記の変更が行われた場合listがあるので、正しい機能が起こることをを見える、けれどもnamesプロパティは(初期のlist小道具の結果に設定されていますが、更新されることはありませんということですsort()が実行され、インプレースソート - https://jsfiddle.net/bruce_one/1qpresbf/https://jsfiddle.net/bruce_one/m3c5rn92/が私が説明しようとしていることを実証しているために更新されました。したがって、コントローラー内でpropを呼び出すのではなく、ビュー内の値を取得するときに呼び出すことができます。

だから、二つの変更(およびソート非変異(ISH)を作る取得する.slice(0))は次のようになります。https://jsfiddle.net/bruce_one/4trL6y22/3/

(Afaictが、これはあなたの問題を修正された?)

+0

おかげで、にサブコンポーネントを回します純粋なコンポーネントがトリックでした。私はまだメカニックを理解しようとしています。コントローラ機能の実行方法と実行時期に関するドキュメントを私に指摘してもらえますか? – user1219358

+0

ええと...私は実際にあなたを指し示すものがないことを知っています(私はコントローラが似たようなたびに呼び出されなかったことに気付きました。関連するコードは、[here](https://github.com/lhorie/mithril.js/blob/next/mithril.js#L749)です。 :-s – Bryce

+1

ええと、私が見つけやすいのは 'コントローラの関数は、コンポーネントがレンダリングされるときに一度呼び出されます。その後、ビュー関数が呼び出され、再描画が必要なときはいつでも、再度呼び出されます。コントローラー関数の戻り値は、最初の引数としてビューに渡されます.' http://mithril.js.org/mithril.component.html - 一般的なコントローラーの説明 – Bryce

関連する問題