我正在编写一个混合应用程序,其中包含一些服务器处理和使用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
答案 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}}