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