6

我对骨干很陌生,所以我这样做可能违反了骨干的本质。建议表示赞赏:

我做了一个墙式系统。所以有一个表格可以用来在墙上发布更新。

每个更新都可以对它们进行评论。我一次显示 10 个更新。所以有10个评论表格。所以我有一个看法:

    CommentForm=Backbone.View.extend({
initialize:function(messageView){

},
events:{
    "submit":"postcomment"
},
showMessage:function(data){
      if(data.success)
            type="success";
               else
            type="error";
           message=data.error?data.error:"Update posted successfully";
           $messageContainer=$this.prev();
           console.log($this);
           var html="<div class='alert alert-"+type+"'>"+message+"</div>";
            $($messageContainer).html(html);
},
postcomment:function(){
        $this=$(this.el);

        $.post(baseUrl+"/portal/post-comment",$this.serialize(),this.showMessage,"json");
        return false;
}


   });

现在我为它创建一个实例,如下所示:

  commentFormView= new CommentForm({el:$(".comment-form form")});

注意 .comment-form 是一个 div。有多个这样的元素。事件处理程序可以很好地附加到所有评论表单。但是当我使用$this=$(this.el);它时,它总是指第一个评论表单。我该如何解决这个问题。$(this.el) 应该引用评论表单的当前实例,其中事件被触发而不是第一个

4

2 回答 2

7

一种方法是使用类似的方法为每个元素创建一个新视图。

$(".comment-form form").each(function() {
    new CommentForm( { el: $(this) } );
});

编辑还有另一种(更好的?)方式。因为事件处理程序将原始事件作为其第一个参数,所以您可以postcomment这样编写处理程序:

postcomment:function(evt){
   // ...
}

然后你可以使用$(evt.srcElement)来获取实际的元素。

postcomment:function(evt){
   $this = $(evt.srcElement);
   // ...
}
于 2012-10-03T03:08:35.263 回答
1

$('.comment-form form') 将返回一个包含所有匹配表单元素的数组。您需要遍历该数组并为每个元素创建一个视图,如 dbaseman 所示。

此外,而不是做

$this=$(this.el)

主干视图已经提供了一个 jquery 包装的 el:

this.$el
于 2012-10-03T06:42:50.637 回答