0

SOを見回しましたが、役に立つものが見つかりませんでした。

連絡先カードビューのBackbone.js連絡先モデルがあります。このビューには、連絡先情報を編集できる多くの入力があります。

ページにはバックボーンモデルではない他の多くのフォームがあるので、それらは「保存ボタン」を使用して保存します。私は基本的にこの保存ボタンもトリガーしたいですContacts.CardView.saveCard();(おそらくそうかもしれませんFileApp.cardView.saveCard as well?-私のコードのいくつかは以下にあります。

これを行う方法はありますか?私は次のものを使用できると思っていましたが、ビューの外にあるものにイベントをバインドしないようです?:

events: {
    "change input": "change",
    "click #save": "saveCard"
},
$('#save').click(function() {
    FileApp.cardView.saveCard;
    _SAVE.save();
})

CardView

window.Contacts.CardView = Backbone.View.extend({

    events: {
        "click #save": "saveCard" // doesnt work because #save is outside the view?
    },

    saveCard: function(e) {
        this.model.set({
            name:$('#name').val()
        });
        if (this.model.isNew()) {
            var self = this;
            FileApp.contactList.create(this.model, {
                success:function () {
                    FileApp.navigate('contacts/' + self.model.id, false);
                }
            });
        } else {
            this.model.save();
        }

        return false;
    }
}

ルーター:

var FileRouter = Backbone.Router.extend({
    contactCard:function (id) {
        if (this.contactList)  {
            this.cardList = new Contacts.CardCollection();
            var self = this;
            this.cardList.fetch({
                data: {
                    "id":id
                },
                success: function(collection, response) {
                    if (self.cardView) self.cardView.close();
                    self.cardView = new Contacts.CardView({
                        model: collection.models[0]
                    });
                    self.cardView.render();
                }
            });

        } else {
            CONTACT_ID = id;
            this.list();
        }
    }
});

var FileApp = new FileRouter();
4

1 に答える 1

4

1つのオプションは、この場合に独自のEventsオブジェクトを作成することです。

// Before initializing views, etc.
var formProxy = {};
_.extend(formProxy, Backbone.Events);

// Add the listener in the initialize for the CardView
window.Contacts.CardView = Backbone.View.extend({
  initialize : function() {
    formProxy.on('save', this.saveCard, this);
  },
  saveCard: function() {
    this.model.set({
        name:$('#name').val()
    });
    if (this.model.isNew()) {
        var self = this;
        FileApp.contactList.create(this.model, {
            success:function () {
                FileApp.navigate('contacts/' + self.model.id, false);
            }
        });
    } else {
        this.model.save();
    }
    return false;
  }
}

// Save
$('#save').click(function() {
   formProxy.trigger('save');
});

参照:http ://documentcloud.github.com/backbone/#Events

于 2012-04-30T01:15:10.073 に答える