1

以下は、問題を説明する jsfiddle です。最初のビューには計算されたプロパティとして elementid があり、2 番目のビューには明示的な要素 ID があります。最初のビューの ID は変更されていませんが、2 番目のビューには 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

これは以前に議論されました。createはプロトタイプを拡張します。計算されたプロパティ値を設定するためのものではありません。これは変わることはありません。これが必要な場合は、setPropertiesの使用を検討できます。

全体として、elementIdはプロトタイプの初期化で使用されるため、オブジェクトの構築後に変更することはできません。したがって、計算されたプロパティを使用してIDが間違っていると判断します。最善の方法は、initメソッドでIDを設定してから、this._super();を呼び出すことです。

于 2013-02-01T09:37:26.887 に答える