使用Backbone触发事件时没有任何反应

时间:2012-06-07 12:51:34

标签: javascript testing backbone.js tdd jasmine

我尝试开始使用Backbone。我有以下JS:

var Question = Backbone.Model.extend({
    defaults: function() {
        return {
          title: "Enter your question",
          type: "smallTextField",
          editMode: true
        };
      },

    initialize: function() {
          if (!this.get("title")) {
            this.set({"title": this.defaults.title});
          }
        },   

    toggleEditMode: function() {
        !this.get("editMode");
    },

    clear: function() {
        this.destroy();
      }         

});

收集:

var Questions = Backbone.Collection.extend({
    initialize: function(models, options) {
        this.bind("add", options.view.addQuestionView);
    }
});

APPVIEW:

var AppView = Backbone.View.extend({
    el: $("body"),

    initialize: function () {
        this.questions = new Questions( null, { view: this });
    },

    events: {
        "click #addQuestion":  "addQuestionModel"
    },

    addQuestionModel: function() {
            var model = new Question();
            this.questions.add(model);
    },

    addQuestionView: function(model) {
        $("#questionBox").append("<div>" + model.get('title') + "</div>");  
    },

}); 

    var appview = new AppView;

以及以下HTML:

<div id="questionBox"></div>
<a href="#" id="addQuestion">Add question</a>

在我的Jasmine规范中,我触发$(“#addQuestion”)。click();

然而 - 当我运行测试时没有任何反应。例如。似乎没有函数绑定到#addQuestion的click事件。

我觉得有些事情做错了,我根本不知道它是什么。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

为什么你的身份证上有#?这是一个错字吗? 尝试删除它(id =“addQuestion”)

另外,您确定在触发点击之前已经初始化了视图吗? 通常,当事件未被触发时,因为它们被设置在超出视图范围的元素上(例如,在视图“el”中未包含的链接上)。但是因为你正在使用身体,我不知道它是如何从那里来的(除非你在帖子中修改它)。 所以我的猜测是你的jQuery选择器在这里没用。 尝试:

el: "body"

而不是:

el: $("body")

答案 1 :(得分:0)

通常当我遇到这个问题时,它与你在传递到Backbone视图中的对象文字的属性在jQuery和DOM完全加载之前被评估的事实有关。

这是一个描述问题的excellent post和几个解决方案。