【问题标题】:Completely remove attribute from Backbone.js model从 Backbone.js 模型中完全删除属性
【发布时间】:2012-10-27 21:59:56
【问题描述】:

我正在尝试从主干模型中完全删除一个属性。该模型被发送到一个不太灵活的 API,如果我在应该发送的属性之上发送其他属性,它会中断,因此我需要删除一个属性,使其不再存在。

我尝试了model.unset,来自this question,但是当我打印出对象时,我试图删除的属性仍然列出,只是值为null。

我需要该属性完全消失。

我的基本结构是:

model.unset("AttrName", "silent");

【问题讨论】:

    标签: javascript backbone.js backbone-model


    【解决方案1】:

    问题是您错误地使用了unset 的参数。 “静音”应该是options hash 的一部分,而不是单独的参数。这有效:

    model.unset("AttrName", { silent: true });
    

    奇怪行为的原因可以看annotated source

    unset: function(attr, options) {
      (options || (options = {})).unset = true;
      return this.set(attr, null, options);
    },
    

    unset 方法假定其options 参数是一个对象,并尝试创建或修改它,然后将其传递给set 方法。如果你改为传递一个字符串,那么代码的无意效果是将属性设置为 null,而不是取消设置。

    【讨论】:

    • 如果我将选项更改为像这样的哈希,它会触发更改事件,这正是我试图通过静默选项避免的。
    • @FrizbeeFanatic14 还有其他问题——如果您使用该语法,它不应引发更改事件(我刚刚对此进行了测试)。
    • 你说得对,是别的东西在调用那个事件。谢谢。
    【解决方案2】:

    覆盖模型的 toJSON 方法并仅包含您希望发送的属性。

    更新:(添加代码示例)

    在扩展模型时,添加一个 toJSON 函数并返回一个具有所需属性的对象:

    {
        toJSON : function() {
            return {
                name: this.get('name'),
                age: this.get('age'),
                phoneNumber: this.get('phoneNumber')
            };
        }
    }
    

    【讨论】:

    • 我对 Backbone 还很陌生 - 我该怎么做呢?
    【解决方案3】:

    您可以尝试仅使用您想要的属性构建一个对象(并发送该属性):

    serializeModel: function() {
      return {
        email: this.$("#email").val(),
        password: this.$("#password").val()
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多