1

オブジェクトのプロパティを、ArrayController にバインドされているプロパティにバインドしようとしています。オブジェクトが既に作成され、ArrayController に追加された後に、これらすべてを実行したいと考えています。

これは、私が達成しようとしていることの単純化された例のフィドルです

スコープに問題があるかどうか疑問に思っています-バインドを設定するために、グローバルパス(つまり、「App.objectTwoController.objectOne.param3」)にバインドしようとしました。また、objectOneController に直接バインドしようとしましたが (これは私がやりたいことではありませんが、機能するかどうかを確認するためだけに試しました)、それでも機能しませんでした。

私が間違っていることについてのアイデアはありますか? この投稿をご覧いただきありがとうございます。

4

1 に答える 1

1

したがって、以下の例では (少し簡略化しましたが、同じ原則が適用されます)... 以下のメソッドは、「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 でラップする必要があります。そうしないと、変更が表示されません。

于 2012-08-09T19:10:26.417 に答える