为什么元素Id作为ember视图中的计算属性不能在ember 1.0.0-PRE.4中工作?

时间:2013-02-01 04:57:55

标签: ember.js

以下是描述问题的jsfiddle。第一个视图将elementid作为计算属性,第二个视图具有显式元素id。第一个视图的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>

1 个答案:

答案 0 :(得分: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

  

之前已经讨论过这个问题。 create extends prototypes,它不是用于设置计算属性值。这不会发生变化。如果需要,可以考虑使用setProperties。

总的来说,因为elementId用于原型初始化,所以在构造对象后不能更改它,因此使用计算属性来确定id是错误的。您可以做的最好的事情是在init方法中设置id,然后调用this._super();