Javascript 主干视图事件绑定延迟

Javascript 主干视图事件绑定延迟,javascript,events,backbone.js,Javascript,Events,Backbone.js,我在初始化视图时触发事件时遇到问题。如果我使用setTimeout调用该事件,则会触发该事件。但是,该事件不会在视图初始化时触发 /*global app */ define([ 'handlebars', 'text!templates/achievements.html' ], function (Handlebars, AchievementsTemplate) { "use strict"; var AchievementsView = Backbone.View.ex

我在初始化视图时触发事件时遇到问题。如果我使用setTimeout调用该事件,则会触发该事件。但是,该事件不会在视图初始化时触发

/*global app */

define([
    'handlebars',
    'text!templates/achievements.html'
], function (Handlebars, AchievementsTemplate) {
"use strict";
var AchievementsView = Backbone.View.extend({

    achievementsTemplate: Handlebars.compile(AchievementsTemplate),

    initialize: function () {
        var el = this.render(this.model);
        this.$weekFilter = $(el).find(".challenge-nav li.open a");
        this.model.bind('change', this.resetFilters, this);
        this.resetFilters();
    },
    render: function (model) {
        this.$el.html(this.achievementsTemplate(model.toJSON()));
        return this.$el;
    },
    events: {
        "click .challenge-nav li a": "filterAchievements"
    },
    resetFilters: function () {
        this.$weekFilter.first().trigger("click");
    },
    filterAchievements: function (ev) {
        console.log("test");
    }
});
return AchievementsView;
});
上面没有调用resetFilters函数,但是如果我执行setTimeout,则会调用该函数。唯一的猜测是,这些活动很晚才开始?有什么想法吗

Hi All,

/*global app */

define([
    'handlebars',
    'text!templates/achievements.html'
], function (Handlebars, AchievementsTemplate) {
"use strict";
var AchievementsView = Backbone.View.extend({

    achievementsTemplate: Handlebars.compile(AchievementsTemplate),

    initialize: function () {
        var el = this.render(this.model);
        this.$weekFilter = $(el).find(".challenge-nav li.open a");
        this.model.bind('change', this.resetFilters, this);
        this.resetFilters();
    },
    render: function (model) {
        this.$el.html(this.achievementsTemplate(model.toJSON()));
        return this.$el;
    },
    events: {
        "click .challenge-nav li a": "filterAchievements"
    },
    resetFilters: function () {
        var self = this;
        setTimeout(function () {
            self.$weekFilter.first().trigger("click");
        },100);
    },
    filterAchievements: function (ev) {
        console.log("test");
    }
});
return AchievementsView;
});

如果
$weekFilter
DOM元素不是成就模板的一部分,因此在
初始化小部件时它在DOM中,那么问题是所有事件都是在初始化后委派的。请参阅主干网的源:


为什么不将
this.resetFilters()
移动到
render()

如果确定未调用
resetFilters
,请尝试在其中添加
控制台.log
。我猜问题在于调用该方法时,
this.$weekFilter
DOM元素没有完全填满。Ya this.resetFilters()肯定正在被调用。控制台。记录它。问题是,当我触发click事件时,不会调用FilterAchievents。甚至连console.logged(this.$weekFilter)都可以查看它是否已加载到DOM中,确实如此。我仍然认为问题在于
this.$weekFilter
self.$weekFilter.first()时未加载。$weekFilter.first().trigger(“单击”)被调用,尝试
console.log(self.$weekFilter.first())
就在
self.$weekFilter.first().trigger(“单击”)之前。绝对可以。将在今晚完成并恢复。