【问题标题】:backbone view why can't I trigger UI event in initialize?主干视图为什么我不能在初始化时触发 UI 事件?
【发布时间】:2015-05-16 07:16:41
【问题描述】:

我在我的 html 中使用引导选项卡,并在事件和模型中使用主干。我想为引导触发选项卡显示事件,以便我可以处理该事件以创建另一个视图(子视图)。

这是我的代码:

var HeaderView = Backbone.View.extend({
    ...
    events : {
       'shown.bs.tab ul.nav-tabs>li>a': 'onTabShown'
    },
    initialize:function() {
        console.log("Header view initialize executing...");
        this.template =_.template(UserTemplate, this.collection); 
        this.render();
        this.$el.find('div.toolbar ul.nav-tabs>li:first>a').tab('show');
        //$('ul.nav-tabs>li:first>a').tab('show');
    },
    onTabShown: function() {
        console.log('tab shown event!');
    }
    ...
}

但是,即使初始化代码成功执行,标签显示事件也不会触发。就此而言,initialize() 中引发的任何 UI 事件都不会触发。

如果我在创建后在视图模块之外调用事件触发器,这将起作用。

是否有可能没有触发 UI 事件,因为视图尚未完全初始化,因为 initialize 仍在执行?似乎解决方法是从该视图之外的一些其他代码调用选项卡显示事件的触发器。有没有更好的方法或做法?

【问题讨论】:

    标签: twitter-bootstrap backbone.js


    【解决方案1】:

    这不起作用,因为您没有调用“delegateEvents”。 将 this.delegateEvents() 添加到您的初始化中,它将起作用。 现在,它没有按预期工作的原因是因为您正在初始化方法中完成所有工作,Backbone.View 构造函数在委托事件之前调用该方法。除了在 Backbone.View 的初始化方法中进行初始化之外,其他任何操作都被认为是一种非常糟糕的做法。另外,节省自己的时间,并使用 Marionette...

    【讨论】:

    • 好的。对于第二个建议,的确,我在上面的应用程序中使用了 Marionette。为简洁起见,我没有展示这些。
    • 如果你使用的是 Marionette,区域的 show 方法会调用 render,所以这也是在 initialize() 中不调用它的另一个原因。将tab('show')放在onRender方法中。
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多