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 以避免任何问题。