1

下面是描述该问题的jsfiddle。第一个视图具有 elementid 作为计算属性,第二个视图具有显式元素 id。第一个视图的 id 没有改变,而第二个视图的 id 没有改变。 http://jsfiddle.net/LZjEx/

App = Ember.Application.create();

App.MultiView = Ember.View.extend({
    templateName : 'appl',
     textInput: Ember.TextField.extend({
        elementId : function(){
            return "disk";
        }.property()
    })
})

App.MultiView.create().append();

<script type="text/x-handlebars" data-template-name="appl">
    {{view view.textInput}}
    {{view Ember.TextField elementId="answer"}}
</script>
4

1 回答 1

6

经过一些挖掘和实验,这是我发现的:

在这个线程中,当 elementId 设置时解释:https ://github.com/emberjs/ember.js/issues/1549

由于视图在 init 上向 Ember.View.views 注册自身,因此需要在运行 init 之前定义 elementId。它与“inDOM”状态无关。

这是一个小提琴确认:http: //jsfiddle.net/LLSQD/

App.MultiView = Ember.View.extend({
    templateName : 'appl',

     textInput: Ember.TextField.extend({
        init: function() {
            // This view's id will not be set to 'disk'.
            return this._super();
            this.set('elementId', 'disk');
        }
    }),
    textInput2: Ember.TextField.extend({
        init: function() {
            // This view's id will be set to 'answer'.
            this.set('elementId', 'answer');
            return this._super();
        }
    })
})

在此线程中解释说,在初始化之前不计算计算属性:https ://github.com/emberjs/ember.js/issues/777

这在之前已经讨论过了。创建扩展原型,它不是用于设置计算属性值。这不会改变。如果需要,可以考虑使用 setProperties。

总的来说,由于 elementId 是在原型初始化时使用的,所以在构造对象后就无法更改,因此使用计算属性来确定 id 是错误的。最好的办法是在 init 方法中设置 id,然后调用 this._super();

于 2013-02-01T09:37:26.887 回答