0

ビューの初期化時にイベントをトリガーする際に問題が発生しました。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;
});
4

1 に答える 1

2

$weekFilterDOM要素がAchievementsテンプレートの一部ではない場合、initializeつまりウィジェットを作成したときにDOM内にある場合、問題は、初期化後にすべてのイベントが委任されることです。バックボーンのソースを参照してください:http://backbonejs.org/docs/backbone.html#section-145

this.resetFilters()に移動してみませんrender()か?

于 2012-07-24T13:27:54.230 に答える