1

我正在编写一个混合应用程序,其中包含一些服务器处理和使用 Ember 实现的主要 UI 部分。

所有与身份验证相关的功能都是基于服务器的,因此当页面加载时,我已经知道(基于 cookie)用户是否经过身份验证。

简而言之 - 在客户端,我有一个userIdcookie,如果设置了它,那么用户就通过了身份验证。

现在我需要让所有模板都可以使用这些数据。

我为应用程序模板解决了它(CoffeeScript 中的所有代码,但那里的语言没有什么特别之处):

路线

ApplicationRoute = Ember.Route.extend
  setupController: (controller) ->
    userId = jQuery.cookie 'userId'
    if userId == 'undefined'
      userId = null
    else
      userId = parseInt userId, 10
    controller.set 'userId', userId

控制器

ApplicationController = Ember.Controller.extend
  userId: null

最后,模板

<strong>
  {{#if userId}}
    userId: {{userId}}
  {{else}}
    No user
  {{/if}}
</strong>

这适用于应用程序模板,但如果我将它移动到index模板,它总是说“没有用户”(我希望控制器有一些原型链遍历)。

我尝试将其移至 boud helper - 效果不佳,根本没有调用 helper:

Ember.Handlebars.registerBoundHelper 'userId', ->
  userId = jQuery.cookie 'userId'
  if userId == 'undefined'
    userId = null
  else
    userId = parseInt userId, 10
  userId
4

1 回答 1

1

我已经使用App.deferReadiness()App.advanceReadiness()结合直接在 上设置全局属性App来处理这种情况。 deferReadiness()阻止 ember 初始化并advanceReadiness()让 ember 完成初始化。

来自ember apideferReadiness()

使用它来推迟准备,直到某些条件为真。

例子:

   App = Ember.Application.create();
   App.deferReadiness();

   jQuery.getJSON("/auth-token", function(token) {
     App.token = token;
     App.advanceReadiness();
   });

这允许您执行异步设置逻辑并推迟启动应用程序,直到设置完成。

例如,您可以使用它在初始化 ember 之前从 cookie 中获取用户的 id,并将其存储在App.currentUser

App = Ember.Application.create({});

App.deferReadiness();

var userId = "1234";//jQuery.cookie 'userId'
if (userId == 'undefined') {
  userId = null;
  App.set('currentUserLoggedIn', false);
  //window.location = "/login"; // redirect to login page
} else {
  userId = parseInt(userId, 10);
  App.set('currentUserLoggedIn', true);
  App.set('currentUser', userId);
  App.advanceReadiness();
}

然后,您可以使用以下命令在您的应用程序中的任何位置访问它:

App.get('currentUser');

或在模板中:

{{App.currentUser}}

JSBin 示例

于 2013-05-08T18:37:24.900 回答