0

我尝试开始使用 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);
    }
});

应用视图:

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 的点击事件。

我猜有些事情做错了,我根本无法弄清楚它是什么。

任何想法?

4

2 回答 2

0

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

这是一篇很好的文章,描述了这个问题和几个解决方案。

于 2012-06-07T13:28:40.413 回答
0

为什么你的 id 中有一个#?是错字吗?尝试删除它(id="addQuestion")

另外,您确定在触发点击之前已初始化视图吗?通常,当事件未触发时,是因为它们设置在视图范围之外的元素上(例如,在视图“el”中未包含的链接上)。但是由于您使用的是正文,所以我看不出它是如何从那里获得的(除非您在帖子中对其进行了修改)。所以我的猜测是你的 jQuery 选择器在这里并不是很有用。尝试:

el: "body"

代替:

el: $("body")
于 2012-06-07T12:57:23.333 回答