我正在开发一个jQuery Backbone.js Web应用程序.
在Adobe Flex中,我已经在我的应用程序中实现了2路数据绑定
输入元素/小部件.
因此,每个输入元素/窗口小部件都知道其对应的模型和模型属性名称.
当用户点击标签或输入时,字段值将自动提供给模型.
在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'});