backbone.js中的双向数据绑定

前端之家收集整理的这篇文章主要介绍了backbone.js中的双向数据绑定前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个jQuery Backbone.js Web应用程序.
在Adobe Flex中,我已经在我的应用程序中实现了2路数据绑定
输入元素/小部件.
因此,每个输入元素/窗口小部件都知道其对应的模型和模型属性名称.
用户点击标签或输入时,字段值将自动提供给模型.
container.model.set(this.attrName,this.value,options); // command 1

在另一个方向,当模型从后端更新时,视图
输入元素/小部件应该自动获取
更新:

container.model.bind("change:"+ this.attrName,this.updateView,this); // command 2

问题是:
用户点击enter并且模型被自动更新时,“change:abc”也是
触发和this.updateView被调用,不仅当一个新的模型来自
后端.

到目前为止,我的解决方案是在用户按Enter(命令1)设置模型值时通过一个选项“source:gui”,并在我的updateView方法中检查.但我不满足于这个解决方案.

有人有更好的解决方案吗?
提前多谢
沃尔夫冈

更新:
当选项silent:true传递时,模型的validate方法不被调用,所以
这没有帮助.请参阅Backbone.js源0.9.2:

_validate: function(attrs,options) {
  if (options.silent || !this.validate) return true;

解决方法

从Backbone.js网站:

A “change” event will be triggered,unless {silent: true} is passed as an option

options.silent = true;
container.model.set(this.attrName,options);

更新:
你为你的问题添加了一个新的评论,所以我补充了我的答案来解决你提到的新的用例(验证流程):

var ExtendedModel = Backbone.Model.extend({
    uiChange : false,uiSet: function (attributes,options,optional) {
        this.uiChange = true;
        this.set(attributes,optional);
        this.uiChange = false;
    }
});

var MyModel = ExtendedModel.extend({
});

var model = new MyModel();
model.on('change:name',function(){
  console.log('this.uiChange: ',this.uiChange);
});

//simulates the server side set
model.set({name:'hello'});

//simulates the ui side set you must use it to set from UI
model.uiSet({name:'hello2'});

猜你在找的JavaScript相关文章