0

commit() を呼び出した後に何をすべきか少し苦労しています。commit()成功したか、サーバーがエラーを返したかに応じて、ユーザーをルーティングする方法を決定したいと考えています。

サーバーにエラーがある場合、400を超えるステータスコードと次のようなエラーが返される可能性があることをどこかで読みました。

{ 'errors' : [ { 'errorCode' : [ 'duplicate-user' ] } ] }

クライアント側には、次のものがあります。

App.UsersController = Ember.ObjectController.extend({

    createUser : function () {
        'use strict';

        var user = App.User.createRecord({
                firstName : $("#firstName").val(),
                lastName : $("#lastName").val(),
                primaryEmailAddress : $("#primaryEmailAddress").val(),
                password : $("#password").val()
            }),

            commitObserver = Ember.Object.extend({
                removeObservers : function (sender) {
                    sender.removeObserver('isError', this, 'error');
                    sender.removeObserver('isValid', this, 'success');
                },
                error : function (sender, key, value) {
                    this.removeObservers(sender);
                    App.Router.router.transitionTo('duplicateuser');
                },
                success : function (sender, key, value) {
                    this.removeObservers(sender);
                    App.Router.router.transitionTo('usercreated');
                }
            });

        user.get('transaction').commit();

        user.addObserver('isError', commitObserver.create(), 'error');
        user.addObserver('isValid', commitObserver.create(), 'success');
    }
});

(注:HTMLで「Ember.TextField」を使用していないため、jQueryを使用しています)

いくつかの質問を聞きたいんです:

  1. これは commit() を処理するための正しい/最善のアプローチですか?

  2. isValid後で呼び出されるように、両方のオブザーバーを削除する必要があることがわかりましたisError-これは予想されることですか?

  3. エラーコードに基づいてルーティングを決定できるようにしたいので、サーバーの応答にアクセスするにはどうすればよいですか?

  4. ルーターを参照できる唯一の方法はスルーですApp.Router.router-よりクリーンな方法はありますか?

  5. エラーが発生した場合、今後再コミットされないようにストアからレコードを削除するために何かする必要がありますか?

4

2 に答える 2

1

コントローラー内から、これを行うことができます:

this.get('target').transitionTo('another.route')

または、現在のルートにイベントを送信し、そこから移行することもできます。

this.get('target').send('eventName');

または、モデルを渡す必要がある場合:

this.get('target').send('eventName', this.get('content'));
于 2013-03-11T04:00:44.413 に答える
0

controller.transitionToRoute("your.route"); を使用するだけです。ソースコードについては、このリンクを参照してください...

于 2013-03-12T17:12:26.153 に答える