Реагировать на события из коллекции в модели? - PullRequest
1 голос
/ 03 февраля 2012
SubCollection extends Backbone.Collection

Model extends Backbone.Model
   subcollection: new SubCollection()

model1 = new Model

model2 = new Model

Когда коллекция в model1 изменяется, мне нужно обновить коллекцию в model2.Они не могут быть ссылкой на одну и ту же коллекцию, когда одно изменение мне нужно отреагировать на изменение и применить его к коллекции в другой модели.

Как бы я это сделал?Это сложно сделать?

Спасибо!

1 Ответ

1 голос
/ 03 февраля 2012

ну,

мы не можем быть уверены, что есть только модель1 и модель2, у нас могут быть модель3 и модель4, поэтому мы не можем фактически связываться с моделями вручную, в противном случае вы получитебольшой беспорядок, подобный этому:

// not an option... >> huge mess :)
model1.bind('add', myFunction());
model2.bind('add', myFunction());
model3.bind('add', myFunction());

так что вместо этого

мы могли бы реализовать агрегатор событий в нашем приложении.и вместо этого работаем с пользовательскими событиями.

// application object
var app = {
    evt: _.extend({}, Backbone.Events);
};

// subcollection
var SubCollection = Backbone.Collection.extend({
    initialize: function(){

        _.bindAll(this, "bubbleEvent", "catchBubbledEvent");

        this.bind('reset', this.myBubble);
        this.bind('add', this.myBubble);
        this.bind('reset', this.myBubble);
        //... every event you want to catch

        app.evt.bind('myCustomEvent', this.catchBubbledEvent);
    },

    bubbleEvent: function(x, y){
        // triggering a general event, passing the parameters
        app.evt.trigger('myCustomEvent', x, y, this);
    },

    catchBubbledEvent: function(x, y, originalCollection) {
        // catch any event raised on the event aggregator and cancel out the loop (don't catch events raised by this very own collection :)
        if(originalCollection.id === this.id)
            return;

       // do your stuff here ...
    }
});

//model
var myModel = Backbone.Model.extend({
    // notice me setting a unique ID in the collection, i pass in the client id of this instance of the model
    subCollection: new SubCollection({id: this.cid});
});

, поэтому в основном мы перехватываем каждое событие коллекции, которое мы хотим, а затем передаем его в общее событие на отдельном агрегаторе событий, который мы имеем для всего нашего приложения,с этим может связываться все, что угодно, и делать что-либо, когда происходит соответствующее событие, так что наша коллекция может связываться с ним и делать что-то еще.поскольку возможно, что ваша коллекция отлавливает событие, которое она отправила сама, нам нужен небольшой тест, чтобы отменить эти ситуации ... и продолжить, только когда другая коллекция вызвала это событие.

...