0

ユーザーがビューの一部であるdivwith クラスをクリックすると、トリガーされる機能があります。この関数は、要素がクリックされたこのビューに属するモデルから属性を取得し、それを 経由でサーバー側に送信する必要があります。.photo_containerPhotoListViewsendSelectedPhotoIdphoto_idPhotodiv .photo_containerfetch()

問題:これまでのところ、 がクリックされたときに関数sendSelectedPhotoIdをトリガーすることができましたが、ビューのモデルdivの属性を取得する方法がわかりません。どうすればこれを達成できますか?photo_idPhoto

ちなみに、正しいものphoto_idが送られるかどうかはわかりません。

コード

$('#button').click( function() {

    // Retrieve photos
    this.photoList = new PhotoCollection();
    var self = this;
    this.photoList.fetch({
        success: function() {
            self.photoListView = new PhotoListView({ model: self.photoList });
            $('#photo_list').html(self.photoListView.render().el);
        }
    });
});

モデルとコレクション

// Models
Photo = Backbone.Model.extend({
    defaults: {
        photo_id: ''
    }
});

// Collections
PhotoCollection = Backbone.Collection.extend({
    model: Photo,
    url: 'splash/process_profiling_img'
});

ビュー

// Views
PhotoListView = Backbone.View.extend({
    tagName: 'div',

    events: {
        'click .photo_container':  'sendSelectedPhotoId'
    },

    initialize: function() {
        this.model.bind('reset', this.render, this);
        this.model.bind('add', function(photo) {
            $(this.el).append(new PhotoListItemView({ model: photo }).render().el);
        }, this);
    },

    render: function() {
        _.each(this.model.models, function(photo) {
            $(this.el).append(new PhotoListItemView({ model: photo }).render().el);
        }, this);
        return this;
    },

    sendSelectedPhotoId: function() {
        var self = this;
        console.log(self.model.get('photo_id'));
        self.model.fetch({
            data: { chosen_photo: self.model.get('photo_id')},
            processData: true,
            success: function() {
        }});
    }

});

PhotoListItemView = Backbone.View.extend({
    tagName: 'div',
    className: 'photo_box',

    template: _.template($('#tpl-PhotoListItemView').html()),


    initialize: function() {
        this.model.bind('change', this.render, this);
        this.model.bind('destroy', this.close, this);
    },

    render: function() {
        $(this.el).html(this.template( this.model.toJSON() ));
        return this;
    },

    close: function() {
        $(this.el).unbind();
        $(this.el).remove();
    }


});

2 回目の試行

また、イベントハンドラーを配置して、モデルの属性を適切に取得できる場所に配置しようとsendSelectedPhotoIdしましたが、コレクションが fetch() を実行したときにイベントPhotoListItemViewをトリガーする方法がわかりません。resetPhotoList

意見

PhotoListItemView = Backbone.View.extend({
    tagName: 'div',
    className: 'photo_box',

    events: {
        'click .photo_container':  'sendSelectedPhotoId'
    },

    template: _.template($('#tpl-PhotoListItemView').html()),


    initialize: function() {
        this.model.bind('change', this.render, this);
        this.model.bind('destroy', this.close, this);
    },

    render: function() {
        $(this.el).html(this.template( this.model.toJSON() ));
        return this;
    },

    close: function() {
        $(this.el).unbind();
        $(this.el).remove();
    },

    sendSelectedPhotoId: function() {
        console.log('clicked!');
        var self = this;
        console.log(self.model.get('photo_id'));
        self.model.fetch({
            data: { chosen_photo: self.model.get('photo_id')},
            processData: true,
            success: function() {
                $(this.el).html('');
        }});
    }


});

問題:これにより、 in functionresetを実行した後にモデルのイベントを発生させることができないようです。つまり、 を使用してモデルを再レンダリングすることができません。fetch()sendSelectedPhotoIdPhotoListViewrender()

下の Chrome の JavaScript コンソールのスクリーンショットでは、 を実行した後にコレクションを印刷しましたsendSelectedPhotoId。2つの新しいモデルを作成して既存のモデルをすべて削除するのではなく、取得した新しいデータを既存のモデルに追加fetch()したようです!

ここに画像の説明を入力

4

1 に答える 1

0

モデルごとに子ビューが既にあるので、クリック イベント ハンドラーを子ビューに配置します。子のハンドラーで、this.model を渡すイベントをトリガーし、親でそのイベントをリッスンします。

更新に基づく更新:

変更してみる

this.model.bind('reset', this.render, this); to 
this.model.bind('remove', this.render, this);  // model is a collection right?

ビューがクリックされた後、コレクションからモデルを削除します。また、 Model.fetch を使用することは、あなたが本当にやりたいことだとは思いません。モデルの .save またはカスタム メソッドでしょうか。

ブログのサンプルベースを示す著者のコメントに基づく更新

私はそのブログのアドバイスには従いません。バックボーンを専門的に使用している場合、Thoughtbot 電子ブックはお勧めできません。

  • 進行中の作業は 50 ドルで、1 セントの価値があります
  • バックボーン アプリを整理する方法を示す簡単なサンプル アプリケーションがあります。これが私が本を買った理由です。
  • バックエンドの例では Rails を使用していますが、Rails、Node、および C# MVC を使用しましたが、すべて問題なく動作します。
于 2012-06-24T18:24:23.933 に答える