Backbone.js : Обновление атрибутов модели внутри события не сохраняется

#javascript #backbone.js

#javascript #backbone.js

Вопрос:

У меня есть следующее в моем App.addInitializer

 App.addInitializer(function () {
   // Collection Map for dynamic slide-in menus
   var map = {
       'groups': {
           'view': GroupsCollectionView,
           'collection': GroupsCollection,
           'title': "Choose Groups"
       }
   };

   var menuModel = new MenuModel({
           id: 'segments-are-cool',
           mode: 'list'
       }),
       menuView = new MenuView({model: menuModel});

    eventer.on('menu-open', function(type){
        var collectionType = new map[type].collection,
            viewType = new map[type].view({collection: collectionType}),
            title = map[type].title;

        menuView.model.set({type: type, title: title});
        menuView.content.show(viewType);
    });

    App.menu.show(menuView);
});
  

По какой-то причине, когда я устанавливаю type и title в модели, при отображении моего представления они также не отображаются в соответствии с тем, что я им установил (отображается значение по умолчанию).

Я backbone.js новичок, поэтому приношу свои извинения за мое невежество

Комментарии:

1. Для чего вы запускаете menu-open событие eventer ? Это выглядело бы так eventer.trigger('menu-open', yourtype); .

2. Магистраль не присоединяет модель к представлению, это означает, что изменения в модели не отражаются в представлении. Другими словами, изначально backbone (конечно, есть плагины) не поддерживает привязку к представлению модели. Одним из быстрых решений было бы повторно отобразить представление после изменения модели.

Ответ №1:

Как объяснил coding_idiot в комментариях, Backbone (в отличие от, скажем, Angular) не обновляется автоматически View при изменении их Model . Хотя это немного менее удобно, это дает вам гораздо больший контроль над тем, что происходит.

В общем, большинство разработчиков Backbone (как предложил coding_idiot) просто вызывают View.render после Model изменений. Вы могли бы даже автоматизировать это, выполнив View вызов this.model.listenTo('change', this.render); внутри его initialize метода.

В качестве альтернативы вы могли бы использовать библиотеку, подобную Epoxy (http://epoxyjs.org /) для дальнейшей автоматизации вашей привязки данных, но лично я бы не рекомендовал это только потому, что я думаю, что очень важно иметь точный контроль над тем, когда и что вы повторно отображаете.