Подтвердить что ты не робот

Как передать свойства в Backbone.Model, которые я не хочу рассматривать как атрибуты?

У меня есть Backbone.Model с именем Company. Моя модель 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
4b9b3361

Ответ 1

Вы всегда можете прочитать его вручную из объекта options и сохранить его, как вам нравится. Параметры передаются как второй аргумент метода initialize:

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

В качестве альтернативы вы можете использовать Backbone-relational, что упрощает обработку моделей, содержащих ссылки на другие модели и коллекцию.

Вас также может заинтересовать сделать toJSON() рекурсивным (патч, который я отправил на свой трекер)

Ответ 2

Вы можете переопределить метод сохранения в модели, чтобы преобразовать сохраненную запись только для отправки имени и идентификатора компании.

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.
   }
});