2014-01-15 2 views
2

У меня есть типичная структура моделей для хранения коллекций.Backbone - Доступ к другим представлениям коллекции

В каждом объекте есть кнопка «Изменить», которая должна деактивировать все кнопки «редактирования» других объектов.

Интересно, что такое наилучшая практика в этом. Благодаря!!

ответ

1

Итак, я придумал следующий подход:

Предположим, что модель обладает свойством status, и когда он модифицируется active Я хочу, чтобы скрыть редактировать кнопку в других записях (или просто отключить Это).

мой взгляд коллекция прислушивается к изменению модели:

initialize: function(){ 
    this.listenTo(this.collection, "change:status", this.triggerEditable); 
}, 

Слушатель обратный вызов выглядит так:

triggerEditable: function(obj){ 
    var triggerValue = null; 

    // I am interested in a status which became 'active' or stopped being 'active' 
    if (obj.get("status") == 'active' && obj.previous("status") != 'active') { 
     triggerValue = "editable:false"; 
    } else if (obj.get("status") != 'active' && obj.previous("status") == 'active') { 
     triggerValue = "editable:true"; 
    } 

    // for any other status change - return 
    if (!triggerValue) return; 

    // trigger is fired for all other objects in the collection 
    _.each(obj.collection.without(obj),function(otherObj) { 
     otherObj.trigger(triggerValue); 
    }); 
} 

Таким образом, когда один объект становится активным или перестает быть активным, edidable:false или edidable:true запускаются для всех других записей. Все, что мне нужно сделать, это добавить к виду модель инициализаторе слушателя:

this.listenTo(this.model, "editable:false", this.disableEdit); 
this.listenTo(this.model, "editable:true", this.enableEdit); 

Здесь я предполагаю, что я мог бы объединить эти две строки в одну, первую, слушая editable имен (как ??) и затем, передав аргумент функции (опять же, как точно?).

Отсюда прямо вперед - реализовать функцию обратного вызова слушателя:

disableEdit: function() { 
    var e = this.$el.find('button.edit') 
    e.attr('disabled','disabled'); 
} 

Если кто-то имеет что-то добавить или сделать это решение лучше, я буду рад услышать. В любом случае, надеюсь, что это будет полезно другим!

2

Вы можете добавить объявление editable на свои модели по умолчанию true. Затем, когда вы нажимаете кнопку «Изменить» на одном из видов, вы можете прокручивать все модели других видов и устанавливать editable на false. В представлении вы будете слушать изменения модели и повторно отобразить представление. Если editable - false, вы можете отключить кнопку редактирования.

+0

Nice one !! Можно ли добавить к свойствам модели, которых нет в базе данных? Как? – guyaloni

+0

Честно говоря, я никогда не синхронизовал мосты Backbone с сервером. Я не могу вообразить, что модели на стороне клиента не будут иметь собственных свойств. У вас может быть специальная реализация метода [sync] (http://backbonejs.org/#Model-sync), но это может быть не самое красивое решение. – rednaw

+0

Смотрите этот ответ, возможно: http://stackoverflow.com/questions/11941010/client-side-only-attributes-in-backbone – rednaw