ember数据findRecord返回值不是预期记录

时间:2017-09-13 20:48:12

标签: ember.js ember-data ember-cli-mirage

我刚刚开始使用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()块中的值时,它给了我一个余烬类

ember inspector screenshot 它应该给我一个实际的申请人信息记录。 这是由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调用。

2 个答案:

答案 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来避免任何问题。