0

フォームとボタンのある残り火(1.0.0-pre2)ビューがあります。フォームはビュークラスにバインドされており、フォーム入力の入力と入力値の収集が可能です。ボタンをクリックすると、フォームの値からdtoオブジェクトを作成し、コントローラーに送信します。ボタンのhtmlは次のとおりです

<input type="submit" value="Add" data-icon="plus" {{action addReport view.report target="controller"}} />

ビューコードは

ContentView: baseView.extend({
    task: null, //initialized when form is filled in
    report: function () {
        var task = this.get('task');
        if (task == null)
            return null;

        return reportModel.create({
            taskId: task.id
        });
    }.property()
})

コントローラコードは

DayController: ember.Controller.extend({
    addReport: function (evt) {
        console.log(evt.context);
    }
})

コードを実行すると、イベントコンテキストがnullになります。デバッガーを見るとreport、ビューがレンダリングされるときに、計算されたプロパティが1回だけ実行されました。ボタンをクリックすると、計算されたプロパティは評価されません-コントローラーメソッドがすぐに呼び出されます。

非常によく似た構造が同じアプリケーションで正常に機能しますが、ビューが異なり、メソッドはコントローラーではなくルーターにあります。

<a href="#" {{action changeDate view.prevDate href=true}}>Prev</a>

見る:

HeaderView: baseView.extend({
    prevDate: function () {
        return addDays(this.get('_dataSource').date, -1);
    }.property()
})

ボタンの何が問題になっていますか、リンクとは対照的にボタンが機能しないのはなぜですか?

4

2 に答える 2

0

OK、いくつかのデバッグの後、コアの誤解を発見しました。

ハンドルバーactionヘルパーによって評価されるアクションのコンテキスト。レンダリング時にのみ実行されます。これが、他のビューが機能した理由です。現在のビューでユーザーが提供するデータを必要とせず、ビューが表示される前に必要なすべての情報が準備されていました。

したがって、contextビューがレンダリングされる前にフィールドを提供する必要があります。これは私のシナリオには関係ありません。コントローラーの回避策に頼る必要があります

DayController: ember.Controller.extend({
    addReport: function (evt) {
        console.log(evt.view.get('report'));
    }
})

残念ながら、コントローラーからビューへの追加の依存関係を作成せずに済むことを願っていました。

于 2012-11-22T18:34:01.320 に答える
0

これが特定の問題かどうかはわかりませんが、計算されたプロパティは依存関係を指定する必要があります。例えば、

}.property('task')

Ember は計算されたプロパティをキャッシュします。依存関係により、Ember はキャッシュ プロパティがいつ無効化されたかを知ることができます。

于 2012-11-22T13:12:00.950 に答える