したがって、以下の例では (少し簡略化しましたが、同じ原則が適用されます)... 以下のメソッドは、「objectTwoController」ではなく「objectTwo」で「objectOne」を検索することになります。
var objectTwoController: Em.Object.create({
objectOneBinding: 'App.objectOne',
objectTwoBinding: 'App.objectTwo',
_onSomething: function() {
var objectTwo = this.get('objectTwo');
objectTwo.bind('param2', Em.Binding.from('objectOne.param3'));
}.observes('something')
});
問題は、2 つの非相対オブジェクト間をバインドできないことです。emberの「connect」メソッドを見ると、両方のパスを観察するために1つの参照オブジェクト(this)しか必要としないことがわかります(これは、例の9.8.1とember-pre-1.0リリースに当てはまります) .
いくつかのオプションがあります (少なくとも私が考えることができます)。
最初: オブジェクトにお互いを伝えることができ、相対パスが機能し始めます。これにより、パスをバインドするときに参照するオブジェクトが実際に「objectTwo」に与えられます。
....
objectTwo.set('objectOne', this.get('objectOne');
....
2番目:2つの同期を維持する独自のオブザーバー/計算プロパティを追加できます(ただし、もう少し冗長です)。あなたは本当に滑らかなものをやってのけることができるかもしれませんが、それは難しいかもしれません. 独自のバインディング (Transform など) を作成して、関連のない 2 つのオブジェクトを両方へのパスがある限りバインドできるようにすることもできます。
_param3: function(){
this.setPath('objectTwo.param2', this.getPath('objectOne.param3');
}.observes('objectOne.param3')
これらは動的に作成でき、事前に定義する必要はありません...
3 番目: 単純にそれらをグローバル パスにします。「App.objectOneController.content.param3」はバインディング「_from」パスとして機能するはずです(ただし、これが実際のアプリケーションでどれだけ役立つかはわかりません。大規模なアプリケーションでは、私は個人的にグローバルなものがすべて好きではないからです)。
EDIT:フルパスを設定するとき。すべてがフラッシュされるまでバインディングが常に更新されるとは限らないため、値を取得する前に現在のサイクルの最後まで待機してください。つまり、アラート メッセージを Ember.run.next でラップする必要があります。そうしないと、変更が表示されません。