这个事件在MarionetteJS的哪里召唤

时间:2013-04-30 06:40:17

标签: backbone.js marionette

我正在探索MarionetteJS的BBCloneMail演示应用程序,但我没有看到事件是如何触发渲染操作的。我在这里看到了一些全球性的“节目”事件:

https://github.com/marionettejs/bbclonemail/blob/master/public/javascripts/bbclonemail/components/appController.js#L25

show: function(){
  this._showAppSelector("mail");
  Marionette.triggerMethod.call(this, "show");
},

但是我没有看到,Marionette.triggerMethod在何处/如何渲染Mail组件。我试图为我的情况调用triggerMethod,但我得到一个'不能调用申请未定义'。为什么上面的调用适用于BBcloneMail应用程序。

trigger Method

我的案例的应用程序控制器:

MA.AppController = Marionette.Controller.extend({

  initialize: function(){
    _.bindAll(this, "_showGenres");
  },


  show: function() {
    if (MA.currentUser) {
      MA.navbar.show(new MA.Views.Items.LogoutNavbar({model: MA.currentUser}));
    }
    else
    {
      MA.navbar.show(new MA.Views.Items.LoginNavbar());
    }
    this._showGenres();
  },

  _showGenres: function() {
    var categoryNav = new MA.Navigation.Filter({
      region: MA.filter
    });
    this.listenTo(categoryNav, "genre:selected", this._categorySelected);
    categoryNav.show();
    MA.main.show(MA.composites.movies);
  },

  showMovieByGenre: function(genre){
    var movies = new MA.Controllers.MoviesLib();
    that = this;
    $.when(movies.getByCategory(genre)).then(that._showMovieList);

    Backbone.history.navigate("#movies/genres/" + genre);
  },

  _showMovieList: function(movieList){
    var moviesLib = new MA.Controllers.MoviesLib({
      region: MA.main,
      movies: movieList
    });
    Marionette.triggerMethod.call(this, "show");

  }
});

我使用以下命令在init.js中初始化应用程序控制器:

app = new MA.AppController();

1 个答案:

答案 0 :(得分:3)

查看source for triggerMethod,这是一种触发事件(传入的字符串)以及另外(如果存在)在具有“on”前缀的对象上运行方法的方法。

在您的情况下,错误与line 560有关,特别是未定义的方法apply。基于代码(在您的情况下)尝试调用this.trigger('show')的等值,但AppController没有名为trigger的方法。

在这种情况下,我猜测在BBCloneMail示例中this(基于triggerMethod.call)实际上并不是控制器,而是要显示的视图。