2016-10-17 2 views
0

Ember 응용 프로그램에서 서버 측 오류를 처리하는 동안 모델에 수신 된 오류가 채워지지 않으므로 템플릿에 오류를 표시 할 수 없습니다. 사용Ember 모델에서 RESTAdapter가있는 서버 측 오류가 채워지지 않았습니다.

버전 :
엠버-CLI : 2.4.3
엠버 데이터 : 2.4.2
어댑터 : RESTAdapter

이 템플릿 파일이 표시 업 표시로 사용자의 양식을 포함

register: function(){ 
    var username = this.controller.get('username'); 
    var email = this.controller.get('email'); 
    var user = this.store.createRecord('user',{ 
      email: email, 
      username: username 
     }); 
    user.save().then(function(){ 
     //handle success 
    },function(error){ 
     //handle error 
    }); 
}); 
:
{{input type="text" value=username }} 
    {{#each model.errors.username as |error|}} 
     {{error.message}} 
    {{/each}} 
    {{input type="text" value=email }} 
    <button {{action 'register'}}>Register</button> 

는 루트 파일은 활동 사용자를 저장하려면 '등록'을 포함 DS.Errors 오류의 문서에 따르면

{  
    "errors":[ 
     { 
     "detail":"can't be blank", 
     "source":{ 
      "pointer": "/data/attributes/username" 
     } 
     } 
    ] 
} 

자신의 속성에 액세스하여 표시 할 수 있습니다 같이 나는 상태 422 오류 응답을 사용하고

export default Model.extend({ 
    email: attr(), 
    username: attr() 
}); 

이 API : 같은

모델 본다 name : 해당 속성에 대한 모든 오류 객체의 배열을 가져옵니다. 그리고 그것이 제가 템플릿 파일에서하려고하는 것입니다.
또한 오류 개체의 메시지 속성에 액세스하지 못했습니다. 나는 오류가

user.save().then(function(){ 
     //handle success 
    },function(error){ 
     //handle error 
     console.log(user.get('errors.length')); 
    }); 

을 즉시 콘솔에 길이 속성을 로그온 할 때

{{#each model.errors.messages as |message|}} 
    {{message}} 
{{/each}} 

항상 여전히 오류를 0 그러나

console.log(user.get('errors.username.length')); 

원하는 출력을 제공 나에게 제공하지만, 템플릿에 표시되지 않습니다.
이 게시물 24027053에서 언급했듯이 RESTAdapter에서 ajaxError를 무시하려고했지만 행운은 없습니다.
내가 뭘 잘못하고 있는지 모르겠다. 도와주세요! 따라서이 오류가없는,

user.save().then(function(){ 
    //handle success 
},function(error){ 
    //handle error 
    console.log(user.get('errors.length')); 
}); 

사용자가 저장되지 않습니다

답변

0

나는 오류가 내에있는 생각합니다. 이것을 시도하십시오 :

user.save().then(function(){ 
    //handle success 
},function(error){ 
    //handle error --> how do you handle it? Are you maybe overriding the default behaviour? 
    // you might want to put a 'debugger;' statement here in order to see, what the response actually looks like 
    console.log(error.errors); 
}); 
+0

나는 기본을 무시하고 있지 않다 통해 오류를 액세스 할 수 실제로는 기본 동작을 구현할 수 없습니다. 내 질문에 두 번 언급했듯이 문제는 템플릿에 오류를 표시하는 것입니다. console.log (user.get ('errors.username'))); error.errors가 원하는 결과를 가져옵니다. 그러나 템플릿에 표시 할 수는 없습니다. model.errors.username, model.errors 또는 단순히 errors.username은 아무 것도 표시하지 않습니다. –

0

오류가있는 모델을 설정하여 문제를 해결했습니다. DS.Errors는 오류가 채워진 후에 모델을 설정하지 않습니다.

var route = this; 
user.save().then(function(){ 
     //handle success 
    },function(error){ 
     var errors = user.get('errors'); 
     route.set('_model.errors',errors); 
    }); 

및 경로 파일의 모델 훅은 다음과 같습니다 :

_model:{}, 
model(){ 
return this.get('_model'); 
} 

레지스터 기능은 오류와 모델 후크 반환과 _model을 채 웁니다 그렇게 _model처럼

지금 내 등록 기능이 보인다 보기에서 사용할 수 있습니다.

1

것이 가장 좋은 방법입니다 경우 모르겠어요 그러나 이것은 나를 위해 일한 것입니다 :

 save(model) { 
     model.save() 
     .then(() => { 
      console.log('success'); 
     }) 
     .catch(() => { 
      if (model.get('errors.messages.length') > 0) { 
       model.get('errors.messages').forEach((message) => { 
        console.log(message); 
       }); 
      } else { 
       console.log('failed'); 
      } 
     }); 
    } 

을 템플릿에서 내가

{{#each model.errors.messages as |error|}} 
    <div class="error"> 
    {{error}} 
    </div> 
{{/each}} 
+1

이전 버전에서는 모델에서 오류가 올바르게 채워지지 않아서 템플릿에서 액세스 할 수 없었던 문제가있었습니다. 그러나 나중에이 문제가 수정되었습니다. –