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 返回值不是预期的记录的主要内容,如果未能解决你的问题,请参考以下文章

ember data 不同模型用于同一端点

Ember.Select 使用 belongsTo Ember 数据模型属性的默认选择值?

Ember.js:让组件观察商店物品的值变化

对包含双引号的记录使用 FindRecord

没有 Ember 数据的 Ember

基于布尔值过滤模板中的 Ember.js 数据