【问题标题】:How can I pass properties into a Backbone.Model which I do not wish to be treated as attributes?如何将属性传递给我不希望被视为属性的 Backbone.Model?
【发布时间】:2011-08-16 20:33:32
【问题描述】:

我有一个名为 Company 的 Backbone.Model。 我的Company 模型有一个Employees Backbone.Collection,其中包含Employee 模型。

当我实例化我的Employee 模型以填充Employees 集合时,我希望它们能够引用它们所属的Company。但是当我在其中传递Company 时,它成为Employee 的属性之一。这是我保存Employee 时的问题,因为toJSON 方法将包含Company 对象,而我在数据库中存储的只是外键整数company_id

我希望 Backbone.Model 有第二个参数,它接受不属于核心属性的模型属性。我怎样才能解决这个问题?我意识到我可以实例化我的 Employee 模型,然后附加 Company,但我真的想在传统的“构造函数”中完成所有任务,而不是从外部附加属性。

例如:

Employee = Backbone.Model.extend({});

Employees = Backbone.Collection.extend({
  model: Employee
});

Company = Backbone.Model.extend({
  initialize: function() {
    this.employees = new Employees({});
  }
});

c1 = new Company({id: 1});
e = new Employee({name: 'Joe', company_id: 1, company: c1});
c1.employees.add(e);

e.get('company'); // => c1

e.save(); // BAD -- attempts to save the 'company' attribute, when in reality I only want to save name and company_id


//I could do
c2 = new Company({id: 2});
e2 = new Employee({name: 'Jane', company_id: 2});
e2.company = c2;
c2.employees.add(e);

e.company; // => c2

//I don't like this second method because the company property is set externally and I'd have to know it was being set everywhere in the code since the Employee model does not have any way to guarantee it exists

【问题讨论】:

    标签: javascript backbone.js


    【解决方案1】:

    您始终可以从options 对象中手动读取它,然后随意存储它。这些选项作为第二个参数传递给初始化方法:

    var Employee = Backbone.Model.extend({
        initialize: function(attributes, options) {
            this.company = options.company;
        }
    });
    var shesek = new Employee({name: 'Nadav'}, {company: Foobar});
    

    或者,您可以使用Backbone-relational,这样可以更轻松地处理包含对其他模型和集合的引用的模型。

    您可能还对making toJSON() recursive(我提交给他们的问题跟踪器的补丁)感兴趣

    【讨论】:

    • Backbone.Model 在这里显示它只接受一个属性数组:documentcloud.github.com/backbone/#Model-constructor 我很想尝试 Backbone-relational 但由于 Backbone 本身仍在变化,我害怕投资可能无法保留的扩展跟上Backbone的快速发展。
    • 但是我在查看代码时看到 Backbone.Model 的初始化函数确实同时采用了属性和选项。我的错。
    • 文档未更新。见constructor source
    • 这实际上正是我想要的。我将在未来查看代码而不仅仅是文档。谢谢!
    【解决方案2】:

    您可以覆盖模型上的保存方法,将保存记录转换为仅发送名称和公司ID。

    Employee = Backbone.Model.extend({
       save: function() {
           var toSend = {name:this.get('name'),company_id: this.get('company').get('id')}
           // method to send toSend to server.
       }
    });
    

    【讨论】:

      猜你喜欢
      • 2013-09-29
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 1970-01-01
      • 2021-11-30
      • 2016-02-28
      • 1970-01-01
      相关资源
      最近更新 更多