2015-01-09 38 views
0

我有一個基本的創建表單設置,它對名稱字段進行了驗證。該窗體的保存操作有一個承諾,優雅地保持錯誤:Ember DS.Errors疑難解答創建表格

actions: { 
     save: function(){ 

      var route = this; 

      var createCampaign = this.store.createRecord("campaign", { 

       code: this.get("code"), 
       name: this.get("name"), 
       description: this.get("description"), 

      }); 

      this.set("code",""), 
      this.set("name",""), 
      this.set("description",""), 

      // POST values to campaigns 

      createCampaign.save().then(function(c){ 

       route.transitionToRoute("campaigns.view",c.id); 

      }, function(errors){ 


      }); 
     } 
    } 

}); 

我的屬性定義是:

TM.Campaign = DS.Model.extend({ 
    name: DS.attr(), 
    code: DS.attr(), 
    description: DS.attr(), 

}); 

我讀過,通過使用RESTAdapter,被覆蓋的ajaxError需求,所以我已經添加了以下內容:

ajaxError: function(jqXHR){ 

     var error = this._super(jqXHR); 

     if(jqXHR && jqXHR.status === 422){ 

      var response = Ember.$.parseJSON(jqXHR.responseText); 

      errors = {} 

      if (response.errors){ 

       var jsonErrors = response.errors; 

       Ember.keys(jsonErrors).forEach(function(key){ 
        errors[Ember.String.camelize(key)] = jsonErrors[key] 
       }); 

      } 

      return new DS.InvalidError(errors) 

     } else { 

      return error 

     } 

    } 

其從API來的響應的結構爲:

{ 

    "errors": { 
     "name": [ 
      "The name field is required." 
     ] 
    } 

} 

但由於某些原因,每當我嘗試顯示DS.Errors(使用console.log(route.get("errors"))時,我都會得到未定義的值。這就像Ember不知道響應中出現驗證錯誤。

我也確保響應狀態返回爲422 Unprocessable Entity。任何人都可以看到我失蹤?

編輯:我已經能夠創建一個JS斌證明我的問題:http://jsbin.com/xujari/2/

回答

0

你jsBin略作修改:

http://jsbin.com/luwaqeyoca/1/edit?js,console,output

DS.InvalidError描述從未說明有關設置路線中的錯誤。肯定的部分是它設置承諾拒絕錯誤。它也設置在record它自身的錯誤屬性如果屬性有一個屬性MACHING錯誤鍵名(在breafe如果你的錯誤關鍵是name,你必須有一個屬性name在你的模型)

 createCampaign.save().then(function(c){ 
      route.transitionToRoute("campaigns.view",c.id); 
     }, function(errors){ 
       console.log(errors.errors.name); //from the promise error 
       console.log(createCampaign.get("errors.name")); //from your record 

     }); 

編輯

這裏是一個斌修改你在評論中問道, http://jsbin.com/sokebuzumu/1/edit?html,js,output

您需要創建在您的控制器中的空對象的「錯誤」作爲jsbin

createCampaign.save().then(function(c){ 

     }, function(errors){ 
      this.set("errors",createCampaign.get("errors")); 
     }.bind(this)); 
+0

謝謝。我能夠控制日誌DS.Errors,但我在前端輸出消息時遇到了問題。我有{{#each message in errors.messages}} {{message}} {{/ each}}但沒有任何內容出現。 – Jetchy 2015-01-10 08:21:50

+0

@Jetchy編輯,以實現你想要的東西......但我不知道這是做事的正確方法。我將控制器的模型設置爲一個新的空記錄,而不是創建兩個屬性,然後在save方法中創建一個空記錄。會讓事情變得更簡單,更合乎邏輯。 – MrVinz 2015-01-10 09:33:28

0

我只是回答了灰燼數據錯誤處理here其中涵蓋了多個方面的錯誤處理涉及您的問題類似的問題。

由於我的PR已合併到Ember Data中,您不必重寫適配器上的ajaxError處理。現在錯誤將被正確地應用到模型中,所以您可以使用前面的答案中的函數來引用錯誤。