6

モデルを保存するときにカスタム エラーを処理する適切な方法はありますか? 例を挙げると、「名前」と「値」の 2 つのプロパティだけを持つモデルがあるとします。そして私がするとき:

var myModel = this.get('store').createRecord('myModel', {"name": "someName", "value": "someValue"});
myModel.save().then(function() {
    //if success
    //server responded with {"myModel:{"id":1,"name":"someName","value":"someValue"}"}
},function() {
    //if failure
    //server responded with {"error":"some custom error message"}
    //BUT HOW TO CATCH THIS AND POSSIBLY REMOVE THE MODEL FROM THE STORE

});

これを回避する 1 つの方法は、追加の ajax 呼び出しを行って、名前が一意かどうかを確認してから保存することです。ここで最善/エレガントなアプローチは何だろうと思っています。

ありがとう、ディー

編集: Groovyのサーバー側でより多くのコンテキストを提供すると少し役立つかもしれないと思いました。だからここにあります:

私のコントローラーには次のものがあります:

def create() {

    try {
        newRow = someService.create(params)
        render someService.list(newRow) as JSON//returns data in format needed by ember-data
    }
    catch (ValidationException ex) {
        def errors = ["errors":[]]

        ex.errors.allErrors.each{
            if(it.arguments[0] == "fieldName" && it.code=="constrantViolated"){
                errors.errors.push(["field":it.arguments[0],"message":"some custom message"])
            }
        }
        //I am using 422 here because of post in http://stackoverflow.com/questions/7996569/can-we-create-custom-http-status-codes
        render(status: 422, contentType: 'JSON', text: (errors as JSON))
    }

}

次に、私の残り火コントローラーで:

    var myModel = self.get('store').createRecord('myModel ', myModelDataInJSON);
myModel .save().then(function () {
        //if success
                },
    function (response) {
        myModel .deleteRecord();
        var errors = $.parseJSON(response.responseText);
        for (var key in errors.errors) {
            //do something
        }
    });
4

3 に答える 3

8

deleteRecordレコードを削除します。

myModel.save().then(function(response) {
  //if success
  //server responded with {"myModel:{"id":1,"name":"someName","value":"someValue"}"}
},function(response) {
  //if failure
  //server responded with {"error":"some custom error message"}
  //BUT HOW TO CATCH THIS AND POSSIBLY REMOVE THE MODEL FROM THE STORE
  if(response.error=='no good'){
    myModel.deleteRecord();
  }

});
于 2013-10-25T04:55:22.733 に答える
2

モデルにプロパティを追加することで、モデルでのエラーを処理できます。

becameError: ->
  # handle error case here
  alert 'there was an error!'

becameInvalid: (errors) ->
  # record was invalid
  alert "Record was invalid because: #{errors}"

チェック: Ember.js Data RESTAdapter を使用する場合、エラーをどのように処理する必要がありますか?

于 2013-12-25T13:10:52.477 に答える
0

DS.ERRORS CLASS を使用するだけで答えにならないのはなぜでしょうか。

EmberJS ドキュメントから:

たとえば、次のような User モデルがあるとします。

App.User = DS.Model.extend({ username: attr('string'), email: attr('string') });

また、バックエンドで検証されなかったレコードを保存しようとしました。

var user = store.createRecord('user', {
  username: 'tomster',
  email: 'invalidEmail'
});
user.save();

バックエンド データ ストアは、次のような応答を返す場合があります。この応答は、エラー オブジェクトを設定するために使用されます。

{
  "errors": {
    "username": ["This username is already taken!"],
    "email": ["Doesn't look like a valid email."]
  }
}

プロパティ名にアクセスするか、messages プロパティを使用してすべてのエラーの配列を取得することにより、ユーザーにエラーを表示できます。

{{#each errors.messages}}
  <div class="error">
    {{message}}
  </div>
{{/each}}

この質問は、モデルへの検証のみに焦点を当てていますか? 永続化/保存と比較すると、データがデータストアに到達する前にデータがきれいになります...アダプターデータストアレベルでもエラー管理が必要なようです。

とはいえ、UI コントロール レベルでテンプレートまたは通常ベースの JS 検証を使用しないのはなぜでしょうか?

于 2014-07-30T16:34:53.720 に答える