我有一个在{{#each}}块中实例化的视图,因此有多个实例。每个视图都需要具有特定于该视图实例的对象的绑定属性。所以通常的方式来声明绑定:
App.hash = Ember.Object.create({
item1: "one",
item2: "two"
});
App.MyView = Ember.View.extend({
itemBinding: "App.hash.itemN"
});
不起作用,因为当我定义绑定映射到(App.hash.itemN
)的内容时,我还不知道它应该是item1还是item2(在上面的代码中用itemN表示)。
我已经找到了解决这个问题的方法,这似乎有点笨拙,如果有正确的方法,我很好奇。这是我的解决方案:
App.MyView = Ember.View.extend({
didInsertElement: function() {
this.set('stub', Ember.Object.create({
itemBinding: "App.hash."+this.get('content')}))
}
})
然后在我的模板中,我可以执行以下操作:
{{#each App.itemController}}
{{#view App.MyView contentBinding="this"}}
{{stub.item}}
{{/view}}
{{/each}}
有更好的方法吗?我的抱怨是,我觉得我正在创造一个不必要的对象。此外,如果我希望视图的其他属性依赖于此特定于实例的对象,我可以说.property(stub.item)
恰好可以工作,尽管在声明它时,stub.item还不存在。
我认为可能有某种方法涉及手动创建绑定,但我无法弄明白。
谢谢!
更新
我已经确认克里斯托弗斯瓦西的解决方案有效。我已经在这个要点中充实了它:
https://gist.github.com/2606979
这非常有用,因为我学到了很多关于观察和回调的知识。虽然最后,我不确定这个解决方案有多简单。尽管如此,它至少也起作用。
答案 0 :(得分:2)
您可以将存根设为计算属性:
hashBinding: 'App.hash',
stub: function() {
return this.get('hash').get(this.get('content'))
}.property('hash', 'content').cacheable()
更新:
contentWillChange: function() {
this.removeObserver('hash.' + this.get('content'), this, 'stubDidChange');
}.observesBefore('content'),
contentDidChange: function() {
this.addObserver('hash.' + this.get('content'), this, 'stubDidChange');
this.stubDidChange();
}.observes('content'),
stubDidChange: function() {
this.notifyPropertyChange('stub');
},
stub: function() {
return this.get('hash').get(this.get('content'))
}.property().cacheable()