2

コントローラとモデルの間に残り火バインディングを設定しようとしています。コントローラーは配列の一部であるため(質問Ember.jsビュー(無制限の数)を参照)、モデル内の要素(ArrayProxy)へのバインディングをのインデックスと同じインデックスで設定しようとしています。コントローラ自体。

バインディングは、ArrayProxyのインデックス付けされていない要素にリンクすると機能しますが、配列の要素を設定しようとすると機能しません。したがって、次のようにバインディングを設定すると、次のようになります。

answerBinding: 'App.SurveyData.test'

App.SurveyDataで、「test」を文字列、たとえば「StackOverlow」に設定すると、双方向バインディングが正しく設定されます。次のようなバインディングを設定した場合

answerBinding: 'App.SurveyData.content'

コンテンツが配列の場合、コンソールで「answer」の値が「Array [2]」であり、各要素が「テストオブジェクト」と期待どおりに等しいことを確認できます。

answerBindingを次のように設定しようとすると

answerBinding: 'App.SurveyData.content[0]'

必要に応じてanswerをSurveyDataの最初の要素にリンクしようとしていますが、コンソールで「answer」の値がundefinedであることがわかります。

コードはhttp://jsfiddle.net/reubenposthuma/dyLGG/1/にあります

どんな考えでもいただければ幸いです

4

2 に答える 2

2

Emberのバインディングは、プロパティに対してのみ機能します。次のような計算プロパティを介してバインドしない限り、配列の特定のインデックスをバインドすることはできません。

answerBinding: 'App.SurveyData.firstItem'

...そしてApp.SurveyDataで計算されたプロパティを定義しました:

firstItem: function() { return this.objectAt(0); }.property('content')

このように考えてください。配列インデックスは[]関数の引数です(文字通りではありませんが、この説明のために)。バインディングは引数を除外することはできません。これらは、バインドするプロパティへの純粋な静的パスです。

于 2012-12-10T03:05:30.943 に答える
0

Marsが言ったように、バインディングは配列のインデックスを受け入れることができないので、回避策を作成しました。これは一方向ですが、双方向バインディングのために配列自体にオブザーバーを持つように変更できます。私の目的(調査からデータを取得して回答配列に入れる)では、一方向バインディングは完全に機能します。

answerObserver: function() {
  App.SurveyData.content[this.id-1] = this.answer;
}.observes('answer'),

データ(この場合はテキストボックス)が変更されるたびに、変更が配列のインデックスにコピーされます。

于 2012-12-10T17:10:39.607 に答える