1

我有一个在 {{#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 还不存在。

我认为可能有某种方法涉及手动创建绑定,但我无法弄清楚。

谢谢!

更新:

我已经确认 Christopher Swasey 的解决方案有效。我在这个 Gist 中充实了它:

https://gist.github.com/2606979

这非常有帮助,因为我了解了更多关于观察和回调的知识。虽然最后,我不确定这个解决方案有多简单。尽管如此,它至少也可以工作。

4

1 回答 1

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()
于 2012-05-02T12:37:49.200 回答