微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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'});

原文地址:https://www.jb51.cc/js/153641.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐