1

{{#each}} ブロックでインスタンス化されたビューがあるため、複数のインスタンスがあります。各ビューには、そのビュー インスタンスに固有のオブジェクトにバインドされたプロパティが必要です。したがって、バインディングを宣言する通常の方法は次のとおりです。

App.hash = Ember.Object.create({
   item1: "one",
   item2: "two"
});
App.MyView = Ember.View.extend({
   itemBinding: "App.hash.itemN"
});

バインディングが ( ) にマップするものを定義するとき、App.hash.itemNそれが item1 または item2 (上記のコードでは itemN で表される) のどちらであるべきかまだわからないため、機能しません。

私はこれを回避する方法を見つけましたが、それは少し厄介なようで、適切な方法があるかどうか興味があります。これが私の解決策です:

App.MyView = Ember.View.extend({
   didInsertElement: function() {
      this.set('stub', Ember.Object.create({
        itemBinding: "App.hash."+this.get('content')}))
   }
})

次に、テンプレートで次のことができます。

{{#each App.itemController}}
   {{#view App.MyView contentBinding="this"}}
      {{stub.item}}
   {{/view}}
{{/each}}

これを行うより良い方法はありますか?私の不満は、不要なオブジェクトを作成しているように感じるということです。また、ビューの他のプロパティをこのインスタンス固有のオブジェクトに依存させたい場合は.property(stub.item)、宣言された時点で stub.item がまだ存在しないにもかかわらず、どちらが機能するかを言うことができます。

バインディングを手動で作成する方法があるのではないかと思いましたが、それがわかりませんでした。

ありがとう!

アップデート:

Christopher Swasey のソリューションが機能することを確認しました。私はこのGistでそれを肉付けしました:

https://gist.github.com/2606979

オブザーブとコールバックについて詳しく学べたので、これは非常に役に立ちました。結局のところ、このソリューションがどれほど簡単かはわかりません。それにもかかわらず、少なくとも同様に機能します。

4

1 に答える 1

2

スタブを計算されたプロパティにすることができます:

hashBinding: 'App.hash',
stub: function() {
    return this.get('hash').get(this.get('content'))
}.property('hash', 'content').cacheable()

更新しました:

contentWillChange: function() {
    this.removeObserver('hash.' + this.get('content'), this, 'stubDidChange');
}.observesBefore('content'),

contentDidChange: function() {
    this.addObserver('hash.' + this.get('content'), this, 'stubDidChange');
    this.stubDidChange();
}.observes('content'),

stubDidChange: function() {
    this.notifyPropertyChange('stub');
},

stub: function() {
    return this.get('hash').get(this.get('content'))
}.property().cacheable()
于 2012-05-02T12:37:49.200 に答える