Добавление моделей в коллекцию вызывает ошибку Uncaught TypeError: невозможно прочитать свойство idAttribute неопределенного

У меня возникла ошибка при попытке добавить несколько моделей с сервера в коллекцию. Выдает ошибку:

Uncaught TypeError: Cannot read property 'idAttribute' of undefined

Вот тестовый пример, который дает ту же ошибку:

<script type="text/javascript" src="js/jquery.3.2.1.min.js"></script>
<script type="text/javascript" src="js/underscore.1.8.3.min.js"></script>
<script type="text/javascript" src="js/backbone.1.3.3.min.js"></script>

<script type="text/javascript">

    var Mymodel = Backbone.Model.extend({
        defaults:{
            id: null,
        },
        idAttributes: "id",
        render: function(){
            collection.add([{id:1, name: "name"},{id:2, name: "name"}])
        }
    });

    mymodel = new Mymodel();

    var mycollection = Backbone.Collection.extend({ model: mymodel });

    collection = new mycollection();

    mymodel.render();

</script>

person aleXela    schedule 07.06.2017    source источник


Ответы (1)


model свойство класса коллекции должно быть конструктором модели, а не экземпляр.

Backbone.Collection.extend({ model: Mymodel });

Класс модели имеет свойство idAttribute в единственном числе, которое по умолчанию уже равно 'id'.


Добавление атрибута id в defaults не обязательно и может привести к проблемам в будущем.


За исключением предыдущих пунктов, выполнение рендеринга внутри модели является плохой практикой. Для этого используйте представление.

render: function(){
    collection.add([{ id:1, name: "name" }, { id:2, name: "name" }])
}

Я понимаю, что это тестовый пример, но если бы это было не так, класс модели не должен изменять экземпляр глобальной коллекции. Весь смысл классов в том, чтобы ограничить ответственность самим классом и ничем за его пределами.

Использование такого глобального просто противоречит самому смыслу использования Backbone.

Требуется минимальный код

var MyModel = Backbone.Model.extend({}),
    MyCollection = Backbone.Collection.extend({ model: MyModel }),
    collection = new MyCollection();

collection.add([
    { id: 1, name: "name" },
    { id: 2, name: "name" }
]);
person Emile Bergeron    schedule 07.06.2017
comment
Я знаю о рендере, просто написал что-то для тестирования. не могли бы вы объяснить о глобальном? что ты имеешь в виду? - person aleXela; 07.06.2017
comment
я сделал это после вашего ответа, но не могли бы вы объяснить здесь глобальную область действия? можете ли вы привести пример, пожалуйста? - person aleXela; 07.06.2017
comment
@aleXela, это целая концепция, которая выходит за рамки этого ответа. Но в качестве примечания: класс модели не должен изменять экземпляр глобальной коллекции. Но я понимаю, что это тестовый пример, так что это не имеет большого значения. - person Emile Bergeron; 07.06.2017
comment
Я вас понимаю. и это пример. большое спасибо. ты помог мне уладить дела. - person aleXela; 07.06.2017
comment
еще одна вещь, если у меня есть два вида и одна модель. в таком случае я могу дать ему как модель: модель для обоих? у меня много таких случаев. какова наилучшая практика для этого? - person aleXela; 07.06.2017
comment
@aleXela да, передача зависимости в подпредставление - лучшая практика. Модель Backbone предназначена для совместного использования, и представления могут легко использовать listenTo для обработки событий из данных. Я перечислил в своем профиле много ответов о Backbone, которые я написал, посмотрите там, вы, вероятно, найдете ответы на вопросы, о которых вы даже не подозревали. - person Emile Bergeron; 07.06.2017