I am having problems triggering an event on the initialization of a view. If I use setTimeout to call the event, the event is fired. However the event is not fire on the view’s initialization.
/*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;
});
The above does not call the resetFilters function, but if I do a setTimeout, the function is called. Only guess is that the events are bound very late? Any Idea?
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;
});
If the
$weekFilterDOM element is not part of the Achievements template, so it is in the DOM when youinitializethe widget, then the problem is that all events are delegated after the initialization. See backbone’s source: http://backbonejs.org/docs/backbone.html#section-145.Why don’t you move
this.resetFilters()torender()?