EmberJS - 在创建对象后添加绑定

时间:2012-08-09 14:20:50

标签: javascript model-view-controller ember.js

我正在尝试将对象的属性绑定到ArrayController中绑定的属性。我希望在创建对象并将其添加到ArrayController之后发生所有这些。

Here is a fiddle with a simplified example of what I'm trying to achieve

我想知道我是否遇到了范围问题 - 我已经尝试绑定到全局路径(即“App.objectTwoController.objectOne.param3”)来设置绑定。我也尝试直接绑定到objectOneController(这不是我想要做的,但只是为了看看它是否有效)并且仍然没有用。

关于我做错的任何想法?提前感谢您花时间看这篇文章。

1 个答案:

答案 0 :(得分:1)

所以在下面的例子中(我简化了一点,但同样的原则适用)...下面的方法最终在“objectTwo”而不是“objectTwoController”上寻找“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')
});

问题是你不能在两个无关系对象之间绑定。如果你在ember中查看“connect”方法,你会发现它只需要一个参考对象(this)来观察两个路径(对于你的例子中的9.8.1和ember-pre-1.0版本都是如此)

你几乎没有选择(我至少可以想到)。

首先:您可以告诉对象彼此,然后相对路径将开始工作。这实际上会在绑定路径时为“objectTwo”提供一个引用的对象。

    ....
        objectTwo.set('objectOne', this.get('objectOne');
    ....

第二次:您可以添加自己的observer/computed property,这样可以使两者保持同步(但它更加冗长)。你可能能够实现一些非常光滑的东西,但这可能很难。甚至可以编写自己的绑定(比如Transforms),只要你有两个不相关的对象,就可以绑定两个不相关的对象。

    _param3: function(){
        this.setPath('objectTwo.param2', this.getPath('objectOne.param3');
    }.observes('objectOne.param3')

您可以动态制作这些动画而不需要预先定义它们......

第三:简单地将它们作为全局路径; “App.objectOneController.content.param3”应该作为您的绑定“_from”路径(但不确定这对您的实际应用程序有多大帮助,因为对于较大的应用程序,我个人并不喜欢全局的一切)。

编辑:设置完整路径时。确保在获取值之前等到当前周期结束,因为在刷新所有内容之前绑定并不总是更新。意思是,您的警报消息需要包装在Ember.run.next中,否则您将看不到更改。