Ember:共同财产的地方?

时间:2013-05-08 09:25:57

标签: javascript ember.js

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

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

简而言之 - 在客户端,我有一个userId cookie,如果设置了,那么用户就会被验证。

现在我需要将这些数据提供给所有模板。

我为应用程序模板解决了它(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 - 也不起作用,帮助器根本没有被调用:

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

1 个答案:

答案 0 :(得分:1)

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

来自ember api for deferReadiness()

  

使用此方法推迟准备,直到某些条件为真。

     

示例:

   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 example