-2

好的,所以我们已经推出了我们的第一个 Backbone JS 应用程序,现在我们有了新问题。显然,当我最初为评论和评论加载模型时,它们具有“created_at”属性,其中包含添加它们的时间戳。当我编辑评论然后执行 model.sync() 时,它会将“created_at”传递回服务器。现在 RoR 应用程序出错了,正如我们的 Rails 开发人员告诉我的那样,我在任何情况下都不能将“created_at”传递回服务器,并且它只是为了显示而计算的。

现在必须给予一些东西。要么我必须在 sync() 之前破解 Backbone 并删除一些属性,要么必须在 Rails 端做一些事情。

您对解决方案有何建议?

在任何情况下,如何在 model.sync() 期间不传递某些属性?我将衷心感谢您的帮助。

4

2 回答 2

1

我在尝试发布到不可变属性时遇到了这个确切的问题。Backbone 模型的问题在于,默认情况下,它们要么全部发布,要么不发布。但是您可以进行部分更新。为了解决这个问题,我创建了一个 Backbone.Model 后代,并像这样覆盖了 model.save:

    save : function(key, value, options) {
        var attributes, opts;

        //Need to use the same conditional that Backbone is using
        //in its default save so that attributes and options
        //are properly passed on to the prototype
        if (_.isObject(key) || key == null) {
            attributes = key;
            opts = value;
        } else {
            attributes = {};
            attributes[key] = value;
            opts = options;
        }

        //Now check to see if a partial update was requested
        //If so, then copy the passed attributes into options.data.
        //This will be passed through to Backbone.sync. When sync
        //sees that there's an options.data member, it'll use it instead of
        //the standard attributes hash.
        if (opts && opts.partialUpdate) {
            opts["data"] = JSON.stringify(attributes);
            opts["contentType"] = "application/json";
        }

        //Finally, make a call to the default save now that we've
        //got all the details worked out.
        return Backbone.Model.prototype.save.call(this, attributes, opts);
    }

这允许我有选择地将我想要的属性发布到后端,如下所示:

//from the view - the GET may have delivered 20 fields to me, but I'm only interested
//in posting the two fields.
this.model.save({
    field1 : field1Value,
    field2 : field2Value
},{
       partialUpdate : true
});

无法告诉你这如何让我的生活变得如此轻松!现在考虑到这一点,有些人可能会问为什么不直接传递 changedAttributes() JSON?原因是因为在某些情况下,更改的属性仅适用于客户端,特别是引发对也使用该模型的视图的更改。

无论如何,试试这个...

于 2012-05-24T17:23:36.767 回答
1

您可以添加到您的模型:

attr_protected :created_at, :updated_at
于 2012-05-24T17:28:06.270 回答