ember 数据 findRecord 返回值不是预期的记录
Posted
技术标签:
【中文标题】ember 数据 findRecord 返回值不是预期的记录【英文标题】:ember data findRecord return value is not the expected record 【发布时间】:2017-09-13 20:48:12 【问题描述】:我刚刚开始使用 Ember,几年后又开始使用 javascript。有一个基本的问题。
我有一个登录页面 - 带有登录路由和控制器。在调用 GET /applicantsinfo/123
时,我已经设置了一个 ember cli mirage 端点以返回申请人信息数据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() 块中的值时,它给了我一个 ember 类
它应该返回给我一个实际的申请者信息记录。 由 cli mirage 返回的
/app/mirage/config.js
this.get('/applicantsinfos/123', () =>
return applicantsinfo: "id": 123, "sessionId": 3, "userName":
'Abc', "salary": '10110', "age": '1100', "password": 'password03'
);
基本上我想在控制器属性中设置这个返回的对象申请者信息,然后转换到下一页表单编辑,我将在其中检索这个属性,使用
this.controllerFor('login').get('applicantsinfo')
所以基本上我有两个问题,我是否应该得到该申请者信息记录而不是 ember _Class 变量。
这也是首先调用身份验证的正确方法,如果它成功,我可能会将 sessionId 从返回的申请者信息记录传递到下一页,在路由中(在 model() 函数中),我可以进行另一个后端调用以根据 sessionId 提取其他客户资料。
请注意,我不是在问如何编写身份验证功能。这个问题可以概括为一种情况——第一个屏幕的控制器进行后端调用,从返回的结果中检索 sessionId,然后转换到下一页,该页面的路由基于从上一页的控制器传递的 sessionId。
【问题讨论】:
【参考方案1】:每当您在 Ember 中处理记录时,您都需要使用 getter 来访问属性本身。如果您只是记录通过 Ember Data 检索到的记录(使用 findRecord、findAll 等),那么在控制台中看到一些类乱码是很正常的。
试试console.log(applicantsInfoRecord.get('userName'))
,看看能不能达到预期效果。
对于身份验证,我认为这可行。一些手动验证通常涉及登录和注销路由以及创建用户服务。我很幸运Ember Simple Auth。我花了一些时间来设置,但是一旦设置好,处理状态就很棒了。
【讨论】:
我确实尝试过执行 console.log(applicantsInfoRecord.get('userName')),但返回未定义。 实际上上面的建议刚刚奏效,但问题出在其他地方,问题是我的模型类禁用了它的字段,所以上面的语句(当我最初尝试时)一直给我未定义。现在,当我修复我的模型以包含相关字段时,它实际上给了我价值。呃..!【参考方案2】:问题出在其他地方,问题是我的模型类的字段被禁用,所以 console.log(applicantsinfo.get('userName) 语句(当我最初尝试时)一直给我未定义。现在当我修复我的模型包含相关字段,它实际上给了我价值。
为了完整起见,还应确保 ember-cli-mirage 的返回值也应在 app/mirage/serializers/application.js 中选择匹配的序列化程序
对于符合 JSON API 的响应,请保留默认值 JSONAPISerializer。 对于简单的 JSON 响应,请改用 RestSerializer 以避免任何问题。
【讨论】:
以上是关于ember 数据 findRecord 返回值不是预期的记录的主要内容,如果未能解决你的问题,请参考以下文章