2012-11-02 32 views
3

我正在使用把手和Backbone的組合。我有一個「容器」視圖,它有一個數組來保存子視圖。每當我添加一個新的視圖,點擊事件沒有被綁定。未添加到DOM中的新元素觸發的骨幹事件

我的文章查看:

Post.View = Backbone.View.extend({ 
    CommentViews: {}, 
    events: { 
     "click .likePost": "likePost", 
     "click .dislikePost": "dislikePost", 
     "click .addComment button": "addComment" 
    }, 
    render: function() { 
     this.model.set("likeCount", this.model.get("likes").length); 
     this.model.set("dislikeCount", this.model.get("dislikes").length); 
     this.$('.like-count').html(this.model.get("likeCount") + " likes"); 
     this.$('.dislike-count').html(this.model.get("dislikeCount") + " dislikes"); 

     return this; 
    }, ... 

中創建一個新的骨幹視圖,它附加到車把模板,並將其顯示在頁面上的「容器」查看我的回調代碼:

success: _.bind(function(data,status,xhr) { 
         $(this.el).find("#appendedInputButton").val(''); 
         var newPost = new Post.Model(data); 
         var newPostView = new Post.View({model: newPost, el: "#wall-post-" + newPost.id}); 
         var source = $("#post-template").html(); 
         var template = Handlebars.compile(source); 

         var html = template(newPost.toJSON()); 
         this.$('#posts').append(html); 
         newPostView.render(); 
         this.PostViews[newPost.id] = newPostView; 
        }, this), ... 

不知道發生了什麼,但是這種代碼最初是爲了設置頁面而運行的(因爲html是呈現在服務器端的,所以無法使用handlebars)並且所有事件都可以正常工作。如果我重新加載頁面,我也可以喜歡/不喜歡帖子。

我錯過了什麼?

回答

1

我沒有看到你追加newPostView.render().el到dom。或我想念somehting?

0

假設「#post-template」包含「likePost」按鈕。 newPostView永遠不會添加到DOM。

將el添加到新的Post.View使骨幹搜索DOM(並且該元素將不存在) 4行後,HTML字符串被添加到DOM(假設this.el已經在DOM中)

如果在追加(html)後創建Post.View,則可以找到該元素並且事件會觸發。
但是自然的Backbone方法是在Post.View渲染函數內部渲染HTML字符串,將結果附加到它的el,並將該el附加到#posts元素。

success: function (data) { 
    var view = new Post.View({model: new Post.Model(data)}); 
    this.$('#posts').append(view.render().el); 
    this.PostViews[data.id] = view; 
}