Backbone在保存后没有使用save()发出put请求

时间:2013-08-08 03:20:49

标签: javascript node.js backbone.js backbone-views

我遇到了一个非常有趣的主干问题,我的一个观点中有这样的函数:

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();

};

1 个答案:

答案 0 :(得分:2)

change未触发第二个示例的原因是因为它是同一个对象而Backbone忽略它。因此没有触发change事件。

至于第一个失败的原因;你有模型的验证器吗?也许是为了验证空字符串的东西? val()可以返回一个空字符串,空字符串上的split()将返回[""]

此外,您的默认值应该是一个函数,否则您的所有模型将具有commentstagsauthorizedUsers

的相同实例

来自Backbone doc。

  

请记住,在JavaScript中,对象是通过引用传递的,因此如果将对象包含为默认值,则它将在所有实例之间共享。而是将默认值定义为函数。

阵列也是对象。

var PostModel = Backbone.Model.extend({
    urlRoot : '/tweet',
    idAttribute: '_id',
    defaults: function(){
      return {
          name: '',
          comments: [],
          tags: [],
          authorizedUsers: [],
          postedBy : '',
          dateCreated: ''
      }
  }
});

最后,array.forEach()在IE8及更早版本上不可用。