0

我在骨干方面遇到了一个非常有趣的问题,在我的一个观点中,我有这样的功能:

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 请求发送成功,但是页面没有重新渲染,因为没有触发 change 事件。当我刷新页面时,我可以看到更新的模型..

我知道我可以在第二个示例中手动触发更改事件,但我更好奇为什么this.model.save()在第一个示例中没有调用 my ..

为了帮助您更多地理解问题,我的模型看起来像:

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

};
4

1 回答 1

2

change你的第二个例子没有触发的原因是因为它是同一个对象并Backbone忽略它。因此没有change触发任何事件。

至于为什么第一个失败;你的模型有验证器吗?可能是验证空字符串的东西?val()可以返回一个空字符串,并且split()在空字符串上将返回[""]

此外,您的默认值应该是一个函数,否则您的所有模型都将具有相同的comments,tagsauthorizedUsers

来自 Backbone 文档。

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

数组也是对象。

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

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

于 2013-08-08T09:32:10.150 回答