2014-09-04 59 views
3

这应该很容易,但我无法弄清楚。我创建的行为有点像三态多重选择一个视图,和其核心部件是视图中的一个属性,它列出了每个选项及其状态:Ember可观察地图

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 2014-09-04 08:59:27

+0

我看到了,但有两个问题。首先,它看起来像是对我的问题严重矫枉过正。其次,我不提前知道房产名称。它们是动态添加和删除的。 – aquavitae 2014-09-04 10:20:05

+0

我之前做过这个,我写了我自己的'ObservableMap'类。这并不难。我会看看我是否能找到它。 – GJK 2014-09-04 12:38:39

回答

1

由于您正在设置属性,因此只需使用notifyPropertyChange通知另一个计算属性,即父对象以某种方式变脏。

this.notifyPropertyChange('parentView.selectionStates'); 

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