我遇到了一个非常有趣的主干问题,我的一个观点中有这样的函数:
addpeople :function(){
var authArray = _.clone(this.model.get("authorizedUsers"));
var values = $(".add-input").val().split(",");
values.forEach(function(value) {
authArray.push(value);
});
this.model.set("authorizedUsers" , authArray);
this.model.save();
},
单击按钮时会调用此函数。此版本的函数会触发change
事件,因为我正在克隆我的数组,但由于某种原因,this.model.save()
永远不会被调用,即服务器永远不会收到PUT请求。当我刷新页面时,我会回到模型的旧状态。
但是,如果我不克隆数组并将函数更改为,则:
addpeople :function(){
var authArray = this.model.get("authorizedUsers");
var values = $(".add-input").val().split(",");
values.forEach(function(value) {
authArray.push(value);
});
this.model.set("authorizedUsers" , authArray);
this.model.save();
},
这次PUT请求发送成功,但由于未触发更改事件,因此不会重新呈现页面。当我刷新页面时,我可以看到更新的模型..
我知道我可以在第二个示例中手动触发更改事件,但我更好奇为什么在第一个示例中未调用this.model.save()
。
为了帮助您更好地理解问题,我的模型看起来像:
var PostModel = Backbone.Model.extend({
urlRoot : '/tweet',
idAttribute: '_id',
defaults:{
name: '',
comments: [],
tags: [],
authorizedUsers: [],
postedBy : '',
dateCreated: ''
},
});
我的node.js更新函数如下:
exports.updateTweet = function(req,res){
console.log("Getting called ! ")
var update = req.body;
var id = req.url.split("/")[2];
Post.update({ _id: id }, { $set: { authorizedUsers: req.body.authorizedUsers }}, function (err, post) {
if (err) return handleError(err);
});
res.end();
};
答案 0 :(得分:2)
change
未触发第二个示例的原因是因为它是同一个对象而Backbone
忽略它。因此没有触发change
事件。
至于第一个失败的原因;你有模型的验证器吗?也许是为了验证空字符串的东西? val()
可以返回一个空字符串,空字符串上的split()
将返回[""]
此外,您的默认值应该是一个函数,否则您的所有模型将具有comments
,tags
和authorizedUsers
来自Backbone doc。
请记住,在JavaScript中,对象是通过引用传递的,因此如果将对象包含为默认值,则它将在所有实例之间共享。而是将默认值定义为函数。
阵列也是对象。
var PostModel = Backbone.Model.extend({
urlRoot : '/tweet',
idAttribute: '_id',
defaults: function(){
return {
name: '',
comments: [],
tags: [],
authorizedUsers: [],
postedBy : '',
dateCreated: ''
}
}
});
最后,array.forEach()
在IE8及更早版本上不可用。