2014-01-17 2 views
4

У меня есть вид и модель, связанные с ним в позвоночнике. Просмотрите наблюдения для изменения модели и соответствующим образом измените ее область отображения. например:Как обрабатывать изменения нескольких базовых моделей в одном обработчике

var Part = Bacbone.Model.extends({ 
    defaults:{ 
    partId = null, 
    manufacturer: null, 
    manufactureDate: null, 
    type: null 
    } 
}); 

var PartsCollection = Backbone.Collection.extends({ 
    model:Part; 
)}; 

var Car = Backbone.Model.extends({ 
    defaults:{ 
     carModel: null, 
     carName: null, 
     color: null, 
     partsCollection: null 
    }, 
    //Overwite the parse method to fill partsCollection 
    parse: function(response){ 
     // creating partsCollection from response and adding an attribute 
     // response.partsCollection = new PartsCollection(); 
     retrun response; 
    } 
}); 

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

Так вот, например, если я заменяю производителя «A» на изготовителя «B» на 1000 частей из 5000 деталей. Это должно изменить мое мнение, и для этого я слушаю событие изменения модели на мой взгляд. Из-за модификации 1000 частей произойдет 1000 изменений событий.

Из-за изменения изготовителя я также могу изменить атрибут «manufacturerDate» модели детали, и если я изменю attor manufacturerDate, который, в свою очередь, вызовет еще 1000 событий.

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

+0

Вы делаете это совершенно неправильно! Почему 1000 изменений в одно и то же время ?! Означает ли конечный пользователь все их в одном месте? Я написал очень тяжелый тест с todomvc (1000+ todos) и придумал идею, что angularjs намного быстрее, чем другие для этого случая. Я также начал проект для этого случая (Lilith.js, еще не готовая базовая вилка, которая быстрая, но вы можете получить от нее идеи!). Кстати, я могу порекомендовать 3 варианта: использовать response.js или другую фреймворк, использовать другой подход привязки или библиотеку на основе ваших потребностей, не делать 1000 изменений! –

ответ

0

Я не знаю, будет ли это правильным способом, но я пришел со следующим решением. Не слушайте изменения на Часть модель в CarView напрямую. Вместо этого в CarView добавить слушателя для change:manufacturer событие на сбор в автомобиле модели this.model.partsCollection. Добавьте API changeManufacturer в коллекцию, которая принимает массив деталей (или идентификаторов частей) и новые детали производителя. API обновит производителя деталей и инициирует событие change:manufacturer Любой код, который хочет сменить производителя деталей в кадре, будет использовать сборник API changeManufacturer, а CarView сможет прослушивать событие change:manufacturer и обновляет себя.

var CarView = Backbone.View.extend({ 
    initialize: function() { 
     // do other stuffs 
     this.listenTo(this.model.partsCollection, "change:manufaturer", manufacturereChanged); 

    }, 

    manufacturereChanged: function(arrOfChangedParts) { 
     // you now have all changed parts array 
     // process as your logic 
    } 
}); 


var PartsCollection = Backbone.Collection.extend({ 
    model: Part, 
    changeManufacturer: function(arrPartIds, newManfacturerDetails) { 
     var arrChangedModels = []; 
     // iterate over ids 
      // get the model and change manufacturer info in model 
      // add changed model to arrChangedModels 
     // ends loop 

     // once all models are changed trigger an event "change:manufacturer" 
     this.trigger('change:manufacturer', arrChangedModels) 
    } 
}); 
0

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

В идеале один триггер должен хорошо работать с обновлением представления с помощью n-элементов.

Смежные вопросы