我刚刚开始使用Ember并在几年后再次使用javascript。有一个基本问题。
我有一个登录页面 - 使用登录路由和控制器。我在调用GET / applicantsinfo / 123时设置了一个ember cli mirage端点来返回applicantsinfo数据
import Ember from 'ember';
export default Ember.Controller.extend({
applicantsinfoRecord: '',
userName: '',
password: '',
actions: {
submitAuthForm() {
const userName = this.get('userName');
const password = this.get('password');
// call to mirage
this.get('store')
.findRecord('applicantsinfo', userName)
.then((applicantsInfoRecord) => {
this.set('applicantsInfoRecord', applicantsInfoRecord);
console.log('inside then function',applicantsInfoRecord);
this.transitionToRoute('form-edit');
})
.then((error) => {
console.log('then error happened', error);
this.set('submissionMessage', 'then(error): There was an error logging in with userName:', userName);
})
.catch((error) => {
console.log('inside catch', error);
this.set('submissionMessage', 'catch(error): There was an error logging in with userName:', userName);
});
}
}
});
login.hbs很简单,用户名/密码字段和提交按钮调用控制器submitAuthForm()函数
login.hbs
<label>Card Number</label>
{{input type="text" value=userName}}
<label>Password</label>
{{input type="text" value=password}}
<button class="primary-link" type="submit" {{action 'submitAuthForm'}}>
Submit
</button>
我的问题是当findRecord调用返回then()块中的值时,它给了我一个余烬类
它应该给我一个实际的申请人信息记录。 这是由cli mirage返回的
/app/mirage/config.js
this.get('/applicantsinfos/123', () => {
return { applicantsinfo: { "id": 123, "sessionId": 3, "userName":
'Abc', "salary": '10110', "age": '1100', "password": 'password03' } }
});
基本上我想在controller属性中设置这个返回的对象applicantsinfo,然后转换到下一页form-edit,我将使用
检索此属性this.controllerFor('login').get('applicantsinfo')
所以基本上我有两个问题,如果我没有得到那个applicantsinfo记录而不是ember _Class变量。
这也是首先调用身份验证的正确方法,如果成功,我可能会将sessionId从返回的applicantsInfo记录传递到下一页,在路由中(在model()函数中),i可以根据sessionId进行另一个后端调用,以获取额外的客户资料。
请注意,我不是在询问如何编写身份验证功能。这个问题可以推广到一个案例 - 第一个屏幕的控制器进行后端调用,从返回的结果中检索sessionId,然后转换到下一页,该页面的路由生成另一个后端基于从上一页的控制器传递的sessionId调用。
答案 0 :(得分:1)
每当您处理Ember中的记录时,您都需要使用getter来访问属性本身。如果您只记录通过Ember Data检索的记录(使用findRecord,findAll等),在控制台中看到一些类乱码是正常的。
尝试console.log(applicantsInfoRecord.get('userName'))
,看看你是否得到了你的期望。
对于身份验证,我认为可行。一些手动身份验证通常涉及登录和注销路由以及创建用户服务。我很幸运Ember Simple Auth。我花了一段时间来建立,但一旦它开始,它处理状态真棒。
答案 1 :(得分:0)
问题出在其他地方,问题是我的模型类已禁用其字段,因此console.log(applicantsinfo.get(&#39; userName)语句(当我最初尝试时)继续给我未定义。现在当我修复我的模型以包含相关字段时,它实际上给了我回复的价值。
为了完整起见,还应该确保来自ember-cli-mirage的返回值应该在app / mirage / serializers / application.js中选择匹配的序列化器
对于符合JSON API的响应,请保留默认的JSONAPISerializer。 对于简单的JSON响应,请使用RestSerializer来避免任何问题。