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

EmberJS - Adding a binding after creation of object

本文关键字:添加 绑定 创建对象 EmberJS      更新时间:2023-09-26

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

这是一个小提琴,其中包含我想要实现的目标的简化示例。

我想知道我是否在作用域方面遇到问题 - 我已经尝试绑定到全局路径(即"App.objectTwoController.objectOne.param3")以设置绑定。我也尝试直接绑定到 objectOneController (这不是我想做的,但尝试它只是为了看看它是否有效),但仍然不起作用。

对我做错了什么有什么想法吗?提前感谢您抽出宝贵时间查看这篇文章。

所以在下面的示例中(我稍微简化了它,但同样的原则适用)......下面的方法最终在"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) 来观察两条路径(对于您的示例和 ember-pre-1.0 版本中的 9.8.1 也是如此)。

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

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

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

第二:您可以添加自己的观察器/计算属性,以使两者保持同步(但它更详细一些)。 你也许能够完成一些非常光滑的东西,但这可能很难。 甚至可以编写自己的绑定(如转换),以允许您绑定两个不相关的对象,只要您有指向这两个对象的路径。

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

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

第三:简单地使它们成为全球路径;"App.objectOneController.content.param3"应该作为绑定"_from"路径(但不确定这对实际应用程序有多大帮助,因为对于较大的应用程序,我个人不喜欢全局的所有内容)。

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