2011-02-26 79 views
0

是否有可能使用Backbone.jsjquery.datalink.js将Backbone模型链接到一组字段,如果是这样的话?使用Backbone.js和jquery.datalink.js

例如,给定:

<div id="person"> 
    <label for="name">Name:</label> 
    <input type="text" name="name" id="name" /> 
</id> 

var m = Backbone.Model.extend({}); 

这似乎是有道理的(但不工作),人们可以:

$("#person").link(m); 

通过 “不行”我的意思是,当我改变模型时,链接不会更新输入字段。当我更改输入字段时,模型不会更新。

我一直在摆弄this on jsFiddle,但无济于事。事实上,数据链接插件似乎并没有像文档中那样工作(除非我犯了错误)。

如果数据链是不适合这个,我会很感激替代方案建议。

我是想法和反馈表示感谢。

+1

从未使用过数据链,但骨干模型通过。获得访问(“田”),所以它不会工作,开箱即用。你需要在链接上实现一个转换器来使用模型的get/set方法。 – Julien 2011-02-28 01:13:04

+0

@Julien:谢谢你的提示 - 我一直在修补和注意到这一点。 :)我在想,如果我正在经历编写转换器的麻烦,我想知道'datalink'的好处是什么...... – 2011-02-28 01:55:37

+0

我通常会在主干中检查变化事件,例如{“change input,textarea,select”:“update_model”},然后将值分配给我的模型。我通过监听模型上的变化事件来重新填充字段,例如this.model.bind(“change”,this.oh_oh_change) – Julien 2011-02-28 14:25:57

回答

1

我没有使用数据链接插件,但是这可能有助于...

这类违反了封装的原则,但你可以使用骨干模型内部的model.attributes对象。

因此,也许是这样的:

$("#person").link(m.attributes); 

此外,当您实例化一个Backbone.Model它看起来像这样:

var m = new Backbone.Model(); 

当你调用Backbone.Model.extend实际上创建一个新的构造(如一个新类),而不是一个对象实例。

1

由@Sam提供的解决方案将工作,但它有关联,你必须知道的问题。骨干模型是可观察的,即。您可以绑定函数以更改模型中的事件。这些事件由Backbone提供的包装器获取器和设置器函数触发。如果绕过这些getter和setter,直接使用model.attributes,则数据更改时不会触发事件。 因此,如果您的数据链接关联是单向即,这不是问题。当JavaScript对象被修改时,视图会改变,但是如果你想实现双向数据链接,你会遇到问题,因为当视图被用户操纵时,模型属性会被修改,但相应的设置器是未使用,因此应用程序代码的其余部分未通知更改。这可能导致难以调试问题。 如果数据绑定是您首要关心的问题,请查看拥有最先进的数据链接功能的KnockoutJS。