2014-09-04 2 views
3

Это должно быть легко, но я не могу понять это. Я создаю представление, которое ведет себя немного как три состояние выбора несколько, а основной компонент является собственностью на представлении, которое перечисляет каждый параметр и его статус:Эмбер наблюдаемая карта

TriState = Ember.View.extend({ 
    ... 
    childView: TristateItem, 
    selectionStates: {} 
}); 

TristateItem = Ember.View.extend({ 
    ... 
    selectedState: function() { 
     var value = this.get('value'); 
     var states = this.get('parentView.selectionStates'); 
     var state = states[value]; 
     if (Ember.isNone(state)) 
      return 0; 
     return state; 
    }.property('value', 'parentView.selectionStates'), 

    click: function(event) { 
     var states = this.get('parentView.selectionStates'); 
     var value = this.get('value'); 
     var newState = states[value]; 
     if (Ember.isNone(newState) || newState == 0) 
      newState = 1; 
     else if (newState == 1) 
      newState = -1; 
     else 
      newState = 0; 
     states[value] = newState; 
     event.stopPropagation(); 
    } 

Таким образом, после нескольких кликов, значения из selectionStates может быть

{0: 1, // value "0" is selected with state "1" 
3: -1, // value "3" is selected with state "-1" 
4: 0} // value "4" is not selected 

Это прекрасно работает, но значение TristateItem.selectedState не меняется. Я предполагаю, что это связано с тем, что невозможно наблюдать объект javascript, но я не могу найти ничего наблюдаемого в Ember, что эквивалентно. Как я могу это сделать?

+0

Дубликат http://stackoverflow.com/questions/22388402/how-to-observe-all-object-property-changes – user3995789

+0

Я видел это, но есть две проблемы. Во-первых, это похоже на серьезный перебор для моей проблемы. Во-вторых, я не знаю названия свойств заранее. Они динамически добавляются и удаляются. – aquavitae

+0

Я сделал это раньше, и я написал свой собственный класс ObservableMap. Это не слишком сложно. Я посмотрю, смогу ли я его где-нибудь найти. – GJK

ответ

1

Поскольку вы устанавливаете свойство, вы можете просто использовать notifyPropertyChange, чтобы сообщить другому вычисленному свойству, что родительский объект каким-то образом загрязнен.

this.notifyPropertyChange('parentView.selectionStates'); 

http://emberjs.jsbin.com/tokese/1/edit

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