Backbone Прослушивание событий Backbone.history

Я использую Backbone + requirejs для создания своего приложения, в модуле ниже функция инициализации используется для загрузки функции инициализации из других двух модулей, называемых «HomeView, InnerView», в этом модуле я хотел бы прослушивать события Backbone.history. но модуль не прослушивал такие события.

Маршрутизатор

// Filename: router.js
define([
'jquery',
'underscore',
'backbone',
'app/config',
'app/views/homeview',
'app/views/inner_view'
], function($, _, Backbone, Config, HomeView, InnerView) {

var AppRouter = Backbone.Router.extend({

    initialize: function() {

    },
    routes: {
        // Define some URL routes
        '': 'defaultRoute',
        '!/home': 'defaultRoute',
        '!/activities': 'activities',
        '!/activities/:id': 'activity',
        '!/vacancies': 'vacancies',
        '!/vacancies/:id': 'vacancies',
        // 404, not found
        '*actions': '404'
    },
    defaultRoute: function() {

        //if this route is served from inner pages, we have to trigger "close:Inner"
        Backbone.trigger('close:Inner'); 
        Backbone.current = 'Home';

    },
    activities: function(){

        Backbone.trigger('view:Activities');
        Backbone.trigger('close:'+Backbone.current);            
        Backbone.current = 'Activities';            

    },
    activity: function(id){

        Backbone.trigger('close:' + Backbone.current);
        Backbone.current = 'Activity';   

    },
    vacancies: function(){

    },     
    404: function(actions) {

        // We have no matching route, lets display 404
        $('.content_wapper').html(actions + " no such page on the system");

    }

});

var initialize = function() {

    HomeView.initialize();
    InnerView.initialize();                

    Backbone.appRouter = new AppRouter();
    Backbone.history.start();

};

return {
    initialize: initialize
};
});

Что не так, что мешает мне прослушивать событие backbone.history внутри другого представления?

Модуль внутреннего обзора

 // Filename: views/boilerplate.js
define([
'jquery',
'underscore',
'backbone',
'app/config',
'text!templates/inner_header.html',
'bootbox',
'text!templates/breadcrumb.html',
'purl'
], function($, _, Backbone, Config, inner_header_template, bootbox, breadcrumbTemplate) {

var url = $.url(),
    InnerView = Backbone.View.extend({

    el: $(".header_content"),
    template: _.template(inner_header_template),
    initialize: function(options) {

        Backbone.history.on('route:activities', this.activities);           

    },
    render: function() {},
    activities: function() {
        alert('activities');
    },
    events: {},
    close: function() {

        $('.top_menu').remove();
        $('.main_menu_inner').remove();
        $('.content_container').empty();
        $(this.el).unbind();
        delete this.$el; //delete the jQuery wrapped object variable
        delete this.el; //delete the variable reference to this node

    }

});

var initialize = function() {

    new InnerView();

};

return {
    initialize: initialize
};


});

person ahmedsaber111    schedule 11.02.2014    source источник


Ответы (1)


Вы запускаете события в объекте Backbone, а не в Backbone.history, попробуйте следующее:

Backbone.history.trigger('close:Inner');

Вы должны слушать на самом маршрутизаторе, а не на Backbone.history. Вот пример, иллюстрирующий это.

person Rida BENHAMMANE    schedule 11.02.2014
comment
Я спрашивал об этом событии Backbone.history.on('route:activities', this.activities);, и упомянутое вами событие идеально подходит для меня :) - person ahmedsaber111; 11.02.2014
comment
Где вы инициировали событие route:activities? - person Rida BENHAMMANE; 11.02.2014
comment
Внутри InnerView, который был инициализирован в функциях инициализации модуля маршрутизатора - person ahmedsaber111; 12.02.2014
comment
Извините, но все, что я вижу в вашем примере, это то, что вы привязываете событие Backbone.history.on('route:activities', this.activities);, а не запускаете его. Я прав ? - person Rida BENHAMMANE; 12.02.2014
comment
Да, я сделал это в соответствии с магистральной документацией, чтобы каждый маршрут автоматически запускал свое событие. и я проверил это на самом маршрутизаторе, и он отлично работает, но не работает с видом - person ahmedsaber111; 12.02.2014
comment
Я обновил свой ответ: route:[name] (params) — запускается маршрутизатором при совпадении определенного маршрута. Если я что-то пропустил, пожалуйста, обновите пример с вашей проблемой - person Rida BENHAMMANE; 12.02.2014