如何设置应用程序范围的变量? (在app控制器上?)

时间:2015-10-29 00:49:10

标签: ember.js

我正在使用最新的Ember,2.1,我想知道如何设置一些应用程序范围的变量,例如用户ID,用户名,电子邮件等,可能是在应用程序控制器上。

虽然ember应用程序有大量文件,但我还没有真正完成很多工作,我有点相信我能分享正确的代码。我没有登录路线文件。我安装了ember简单的auth插件,但我并没有以任何特殊方式实际使用/调用它,除非将它混合到我的应用程序路径中:

import ApplicationRouteMixin from 'simple-auth/mixins/application-route-mixin';
export default Ember.Route.extend(ApplicationRouteMixin)

我的路由器:

this.route('login')

我的登录模板:

<button {{action 'forceLogin'}}>Force login of devinrhode2@gmail.com by clicking this action button</button>
<p>Your account id is: {{account_id}}</p>

我的登录控制器:

export default Ember.Controller.extend({
  actions: {
    forceLogin: () => {
      var data = {
        "account_id": 123,
        "email":"devinrhode2@gmail.com",
        "name":"Devin Rhode"
      }
      this.setProperties(data)
    }
  }
});

我调用了forceLogin控制器操作,但是{{account_id}}没有填充到模板中。我如何让account_id呈现回模板?如何通过在我需要的地方调用this.get(&#39; account_id&#39;)来使我的ember应用程序全局访问account_id?

目前我收到错误:

 Cannot read property 'setProperties' of undefined

1 个答案:

答案 0 :(得分:2)

由于您定义forceLogin的方式,您收到错误。箭头函数绑定到它们被定义的上下文。这是您的代码编写的内容:

var _this = this; // we capture `this` from out here!
export default Ember.Controller.extend({
  actions: {
    forceLogin() {
      ...
      _this.setProperties(data) // `_this` is the window!
    }
  }
});

这不好,因为this应该是控制器的实例,而不是window

相反,您应该像这样定义forceLogin

export default Ember.Controller.extend({
  actions: {
    forceLogin() {
      ...
      this.setProperties(data) // `this` is our controller instance
    }
  }
});

要从其他地方获取account_id,您可以注入登录控制器:

// in some other controller
export default Ember.Controller.extend({
  login: Ember.inject.controller(),

  actions: {
    doSomethingWithTheAccountId() {
      var accountId = this.get('login.account_id');
      ...
    }
  }
});

将这些属性移动到服务会更加清晰,您可以使用Ember.inject.service()

将其注入任何位置