2012-05-02 8 views
1

私は{{#each}}ブロックでインスタンス化されたビューを持っているので、複数のインスタンスがあります。各ビューには、そのビューインスタンスに固有のオブジェクトに対するバウンドプロパティが必要です。だから、宣言の通常の方法バインディング:emberjsでビューインスタンス固有のバインディングを作成する理想的な方法は何ですか?

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}} 

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

手作業でバインディングを作成する方法があるかもしれないと思っていましたが、それを理解できませんでした。

ありがとうございます!

更新:

私はクリストファーSwaseyのソリューションが動作することを確認しました。私は、この要旨でそれを肉付けしました:

https://gist.github.com/2606979

私が観察し、コールバックについての詳細を学んだように、これは、非常に有用でした。結局のところ、このソリューションがどれほど簡単であるかはわかりません。それにもかかわらず、少なくとも同じように機能します。

答えて

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() 
+0

問題はApp.hash.item1が変化したときに計算されたプロパティが呼び出される必要がありますです。しかし、上記で定義された計算されたプロパティはApp.hashだけを監視します。私がビューを拡張すると、App.hash内のどのアイテムをバインドするのかわかりません。私が必要とする情報が "this"にバインドされているというビューをインスタンス化するのは一度だけです。 –

+0

このケースでオブザーバーを設定する方法を示すために更新しました –

+0

ありがとうございましたChristopher、私はあなたのソリューションの動作を確認し、それに応じて私の質問を更新しました。 –

関連する問題