2

私はエンバーから始めたばかりなので、この質問がばかげていると思われる場合はご容赦ください。属性名を持つ人のリストを保持する ArrayController があります。次のハンドルバー呼び出しを使用して、コンテンツ配列内の各名前のテキスト フィールドを作成しています。

{{#each App.Controller}}
{{view Em.TextField placeholder="Name" valueBinding="name" }}
{{/each}}

これは期待どおりに機能しています。最初にコンテンツ配列をいくつかの名前で初期化し、各エントリのテキスト フィールドを表示します。ただし、pushObject を使用して人をコンテンツ配列に追加すると、新しいテキストフィールドは追加されません! コンソールを使用すると、人々がコンテンツに追加されていることがわかります。ビューは単に変更されていません。まだ見知らぬ人ですが、次の方法で人を追加すると、すべてが期待どおりに機能します。

this.pushObject(newPerson);
var copy = this.get('content');
this.set('content',[]);
this.set('content',copy); 

この方法で人を追加すると、新しく追加された人の別のテキスト フィールドが表示されます。ember のドキュメントには、pushObject() は KVO に準拠していると書かれていますが、それは依存関係を更新し、ビューを更新する必要があるという意味ではありませんか? ビューを更新するたびに、rerender() またはその他の関数を呼び出して pushObject() を更新する必要がありますか?それとも、ビューを更新するたびに配列をコピーする必要がありますか? ありがとう!

4

2 に答える 2

0

だから私は問題を理解しました。コントローラーの初期化関数では、次のようにコンテンツ配列に要素を追加するだけでした

App.Controller = Em.ArrayController.create({
content: [],

init: function(){
    this.insertNew();
},


insertNew: function(){
    var t = App.Person.create({
        name:"test"
    });
    this.pushObject(t);
},   

});

このコードは、insertNew が呼び出されたときにビューを変更しませんでした (ただし、初期化は機能しました)。this.set("content",[]) を init 関数 insertNew に追加すると、期待どおりに動作しました。作業コードは次のとおりです。

App.Controller = Em.ArrayController.create({
content: [],

init: function(){
    this.set("content",[]);
    this.insertNew();
},


insertNew: function(){
    var t = App.Person.create({
        name:"test"
    });
    this.pushObject(t);
},   

});

最初の content:[] 行は、後でコンテンツを再度設定する必要がないことを意味していると思っていましたが、配列を初期化するときに再度設定する必要があるようです。

于 2013-05-20T16:38:48.977 に答える
0

新しいアイテムを追加するために使用this.pushObjectすると、アイテムが最初のオブジェクトである場合にのみビューが更新されます。

後で試してみましたがthis.insertAt、問題なく動作します。

于 2013-12-03T12:17:34.927 に答える