Backbone Relational с TypeScript — findOrCreate не работает при использовании пользовательского idAttribute

Когда я определяю пользовательский idAttribute в моей модели Backbone, findOrCreate не будет работать, говоря:

Uncaught Error: Cannot instantiate more than one Backbone.RelationalModel
with the same id per type!  

Я думаю, что это проблема TypeScript. Я не знаю, связано ли это, но когда вы создаете класс с TypeScript и устанавливаете idAttribute, как показано ниже, вы увидите, что сам объект имеет явное свойство «idAttribute», чего не происходит, когда вы делаете это в простом JavaScript;

module Application.Models {
    export class Zoo extends Backbone.RelationalModel {
        constructor(options?) {
            this.relations = [{
                type: Backbone.HasMany,
                key: 'animals',
                relatedModel: 'Application.Models.Animal',
                collectionType: 'Application.Models.AnimalCollection',
                reverseRelation: {
                    key: 'livesIn',
                    includeInJSON: 'id'
                }
            }];
            super(options);
        }
    }

    export class Animal extends Backbone.RelationalModel {
        constructor(options?) {
            this.idAttribute = "AnimalId";
            super(options);
        }
    }

    export class AnimalCollection extends Backbone.Collection {
            constructor(options?) {
            super(options);
            this.model = 'Application.Models.Animal';
        }
    }
}

var artis = new Application.Models.Zoo({ name: 'Artis' });
var lion = new Application.Models.Animal({ AnimalId: 123, species: 'Lion', livesIn: artis });

Application.Models.Animal.findOrCreate({ AnimalId: 123 }); // FIRST TIME FINE
Application.Models.Animal.findOrCreate({ AnimalId: 123 }); // SECOND TIME - NOT FINE

person user888734    schedule 01.07.2013    source источник


Ответы (2)


Свойство idAttribute должно быть определено в прототипе. Ваш код определяет idAttribute для каждого экземпляра класса.

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

export class Animal extends Backbone.RelationalModel {
    public get idAttribute () { return 'AnimalId' }
}

Вы также можете добавить его в класс после того, как он будет определен с помощью ванильного JavaScript.

Animal.prototype.idAttribute = 'AnimalId';
person thoughtrepo    schedule 10.07.2013

Хм. Кажется, это работает, если вы установите idAttribute в инициализации вместо конструктора:

initialize: function(attributes) {
        this.id = attributes['AnimalId'] || attributes['id'];
      },
person user888734    schedule 01.07.2013