2015-07-23 1 views
0

У меня возникли проблемы с обработкой событий между моими взглядами и коллекциями. В приведенном ниже примере вы можете найти краткую версию того, как выглядит мой webapp, и как теперь обрабатываются события.Marionette - События, вызываемые несколько раз

Что здесь происходит то, что при переходе от menu1 к menu2 или даже при переходе в обратном направлении, это вызывает, что «APP: change_city» слушатель события складываются. Поэтому, когда я запускаю это событие, он вызывает метод OnCityChange() столько раз, сколько я переключался между меню.

Я сейчас не уверен, правильно ли использую агрегатор событий (eMgr). Может ли кто-нибудь помочь?

eMgr.js

define(['backbone.wreqr'],function(Wreqr){ 
    "use strict"; 
    return new Wreqr.EventAggregator(); 
}) 

AppRouter.js

define(['marionette'], function (Marionette) { 
    "use strict"; 

    var AppRouter = Marionette.AppRouter.extend({ 
     appRoutes: { 
      'menu1' : 'showMenu1', 
      'menu1' : 'showMenu2' 
     } 
    }); 

    return AppRouter; 
}); 

AppControler.js

define(['underscore', 'backbone', 'marionette', '../eMgr'], function (_, Backbone, Marionette, eMgr) { 
    "use strict"; 

    var Controller = Marionette.Controller.extend({ 
      initialize: function(){ 
       console.log("AppRouter - Init") 
      }, 

      showMenu1: function (city) { 
       console.log(" [Info] [AppControler] opening Menu1"); 
       eMgr.trigger("APP:open_menu", { menu: "Menu1", city: city}); 
      }, 

      showMenu2: function (city) { 
       console.log(" [Info] [AppControler] opening Menu2"); 
       eMgr.trigger("APP:open_menu", { menu: "Menu2", city: city}); 
      } 
    }); 

    return Controller; 
}); 

App.js

define([ 'backbone', 'underscore', 'marionette', 'eMgr', 
    'layouts/MainMenu/layoutview.menu1', 
    'layouts/MainMenu/layoutview.menu2', 
    'controllers/AppController', 'routers/AppRouter'], 
    function (Backbone, _, Marionette, eMgr, 
    lv_mainmenu1, lv_mainmenu2, 
    AppController, AppRouter) { 
    "use strict"; 

    var MyApp = new Marionette.Application(); 
    var controller = new AppController(); 

    MyApp.addRegions({ 
     ..... 
     mainmenu: '#main_menu', 
     ..... 
    }); 

    MyApp.listenTo(eMgr, "menu_changed",function(eData){ 
     switch(eData.menu){ 
      case "Menu1": 
       MyApp.mainmenu.show(new lv_mainmenu1(eData)); 
       break; 
      case "Menu2": 
       MyApp.mainmenu.show(new lv_mainmenu2(eData)); 
       break; 
     } 
    }); 

    MyApp.addInitializer(function(options) { 
     var router = new AppRouter({ 
      controller : controller 
     }); 
    }); 


    MyApp.on("start", function(){ 
     if (Backbone.history){ 
      Backbone.history.start(); 
     } 
    }); 

    $(document).ready(function() { 
     MyApp.start(); 
    }); 
}); 

layoutview.menu1.js

define([ 'backbone', 'underscore', 'marionette', 
      'templates/template.mainmenu', 
      'layouts/MainMenu/collectionview.categories'], 
    function (Backbone, _, Marionette, t_Menus, c_Categories, cv_Categories) { 
    "use strict"; 
    var Menu1LayoutView = Marionette.LayoutView.extend({ 

     template: t_Menus['menu1'], 

     regions: { 
      menu : '#menu' 
     }, 

     initialize: function(options){ 
      this.city = options.city 
     }, 


     onRender: function(){ 
     }, 

     onShow: function(){ 
      this.menu.show(new cv_Categories({city:this.city})); 
     } 
    }); 

    return Menu1LayoutView; 
}); 

collectionview.categories.js

define([ 'backbone', 'underscore', 'marionette', 
    'layouts/MainMenu/compositeview.subcategories', 
    'collections/MainMenu/MM.collection.categories'], 
    function (Backbone, _, Marionette, cv_Subcategories, c_Categories) { 
    "use strict"; 
    var CategoriesCollectionView = Marionette.CollectionView.extend({ 

     initialize: function(options){ 
      this.collection = new c_Categories([], {city: options.city}); 
     }, 

     getChildView: function(model){ 
      return cv_Subcategories; 
     }, 

     onRender: function(){ 
     }, 
     onShow: function(){ 
     } 
    }); 

    return CategoriesCollectionView; 
}); 

Это где все данные в категории являются извлекаются из , он также повторно извлекает данные, как только событие APP:change_city bei ng.

MM.collection.categories.js

define([ 'underscore', 'backbone', 'eMgr','models/MainMenu/MM.model.category'], function(_, Backbone, eMgr, m_Category){ 
    var CategoriesCollection = Backbone.Collection.extend({ 
    model: m_Category, 

    initialize: function(attr, opts) { 
     this.city = opts.city; 
     this.fetch(); 
     eMgr.once("APP:change_city", this.OnCityChange, this) 
    }, 

    url: function(){ 
     return 'AF_GetCategories?city='+this.city; 
    }, 

    OnCityChange: function(eData){ 
     /// this is the part which is being called multiple times !!!!! //// 
     /// when checking eMgr's events , it shows that the events are stacking up .. 
     this.url= 'AF_GetCategories?city='+eData.city; 
     this.fetch(); 
    } 
    }); 

    return CategoriesCollection; 
}); 

compositeview.subcategories.js

define([ 'backbone', 'underscore', 'marionette', 
    'templates/template.mainmenu', 
    'layouts/MainMenu/itemview.subcategory'], 
    function (Backbone, _, Marionette, t_MainMenu, iv_Subcategory) { 
    "use strict"; 
    var SubcategoriesCompositeView = Marionette.CompositeView.extend({ 

     template: t_Menus['subcategorieslayout'], 

     childViewContainer: "#category-wrapper", 

     getChildView: function(model){ 
      return iv_Subcategory; 
     }, 

     initialize: function(){ 
      this.collection = this.model.get("subcategories"); 
     }, 


     onRender: function(){ 
     }, 

     onShow: function(){ 
      this.$el.find("#loading").fadeOut(150); 
     } 
    }); 

    return SubcategoriesCompositeView; 
}); 

ответ

0

Я пришел к выводу, что сохранение слушатели событий this.listenTo("custom_event", this.do_something) в любой модели или сбор не является хорошей идеей. События не были очищены должным образом при переключении между menu1 и menu2. Он работал только тогда, когда я вручную вызывал eMgr.stopListening() перед загрузкой любых просмотров.

Поэтому я пробовал переместить всех слушателей событий от models/collections к их мнению и Voila! ... все сработало! События больше не срабатывают несколько раз, как раньше.