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

1 つの方法は、このようなものを使用して各要素の新しいビューを作成することです。

$(".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 に答える