0

在我的主干/牵线木偶应用程序中提交表单后,我在保存现有模型时遇到问题。

所以,我提交表单并使用backbone.syphon 创建表单数据的表示。我构建的对象如下所示:

{languages: {
    {
        de_DE: {
            default: false
            enabled: true
        },
        en_US: {
            ...
        }
        ...
    }
}

我正在尝试将其保存到具有如下属性的主干模型中:

attributes: {
    id: "5"
    languages: {
        de_DE: {
             default: false,
             label: "German"
             language: "de_DE"
             selected: false
         },
         en_CA: {
         ...
         },
         ...
     }
}

问题是,当我model.save(data)使用上述数据结构为我的数据保存现有模型时,默认和标签实例已从我的模型中完全删除。它们甚至没有发送到服务器。尽管它们确实位于previousAttrs对象中,但它们只是被完全移除。

我的模型同步设置的实例如下所示:

sync: function(method, model, options){
    var baseUrl = window.location.origin+'/qp-api/v1/master-app/';

    var config = {}

    switch(method){
         case "create":
         break;
         case "read":
             config = _.extend(config, {
                 method: "GET",
                 url: baseUrl+this.id+'/languages'
             });
         break;
         case "update":
             config =_.extend({
                 method: "PUT",
                 url: baseUrl+this.id+'/languages'
             });
        break;
        case "delete":
        break;
    };
    options = _.extend(options, config);

    return Backbone.Model.prototype.sync.call(this, method, model, options);
}, 

我究竟做错了什么?我认为主干的保存功能只会更新更改的属性。在我看来,我的数据对象应该映射到我的模型属性的设置。他们不应该只是更新吗?我不了解现有模型的保存方式吗?

4

1 回答 1

3

首先我想提一下,做这样的检查并不是一个好主意if(languages.save(data){ .... })model.save()将返回promise object,因此您的if条件将无法按预期工作。

您的问题的解决方案之一是覆盖语言模型的save方法。

var Languages = Backbone.Model.extend({ 
   // Declaration of you model 
   save: function (attrs, options) { 
   // merge attrs here with defaults/initial values
   return this.constructor.__super__.save.call(this, attrs, options); 
   } 
})

希望这可以帮助!

于 2014-07-01T10:28:21.667 回答