La situación es que tengo una pantalla de inicio de sesión que funciona excepto cuando hay un inicio de sesión fallido (401 no autorizado). Básicamente, es muy simple en este momento, el controlador (plantilla) está tratando de acceder a una propiedad de la ruta para determinar si la llamada al back-end (rieles) falló.
{{#if loginFailed}} <div class="alert">Invalid username or password.</div> {{/if}}El archivo de ruta se parece a esto, he omitido cualquier código confidencial o código de trabajo que no sea necesario:
import Ember from 'ember'; import ajax from 'ic-ajax'; export default Ember.Route.extend({ loginFailed: false, isProcessing: false, beforeModel: function(){ //some stuff }, actions: { login: function() { this.setProperties({ loginFailed: false, isProcessing: true }); var _this = this; ajax({ url: //something, type: 'post', crossDomain: true, data: //some stuff, }).then( function(result) { //logging in logic all works }, function(error){ if (error.jqXHR.status === 401) { _this.set('isProcessing', false); _this.set("loginFailed", true); } } ); }, }, reset: function() { this.set('isProcessing', false); this.controller.set('password', ''); this.controller.set('username', ''); } });He realizado algunas depuraciones y, de hecho, golpea el bloque de error para la promesa de ajax, sin embargo, parece fallar. Creo que falla porque es 401, los recursos limitados me han llevado a esta conclusión.
Puede ver que loginFailed es la propiedad que estoy tratando de cambiar y cuando ocurre el error 401, y en la plantilla, esta es la propiedad a la que estoy tratando de acceder.
Soy muy nuevo en Ember y solo trabajo en él desde hace poco más de una semana, por lo que cualquier ayuda sería increíble.
Aquí están las versiones que estoy usando cuando ejecuto ember -v en mi proyecto:
version: 1.13.8 node: 0.12.7 npm: 2.13.4 os: win32 x64Debe establecer la propiedad en el controlador , no en la ruta.
_this.set("controller.loginFailed", true);No puede utilizar las propiedades de una ruta en la plantilla correspondiente. Puede usar controladores para este propósito o puede usar model hook para pasar todos los parámetros.
Creo que una mejor alternativa podría ser hacer que las plantillas de sus rutas sean lo más ficticias posible para que solo pasen datos y controladores de acción necesarios a los componentes.
La mayoría de las plantillas de nuestras rutas contienen solo un componente y toda la lógica se encuentra en los componentes y sus componentes internos. Todos los controladores de eventos también se encuentran en los componentes a menos que necesiten llamadas al servidor. Por lo tanto, es mejor que mueva este código a su componente de inicio de sesión:
{{#if loginFailed}} <div class="alert">Invalid username or password.</div> {{/if}}Entonces la plantilla de su ruta será así:
{{my-login-component loginPressed="login" loginData=model}}Toda la otra lógica estará en el archivo js de su componente.