在emberjs中创建特定于视图实例的绑定的理想方法是什么?

时间:2012-05-02 01:59:57

标签: ember.js

我有一个在{{#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

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

1 个答案:

答案 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()