Ember.js 在具有身份验证的应用程序中加载公共数据的位置
我有一个带有侧栏的应用程序,它总是可见的。对于这个侧边栏,我必须加载一次公共数据。这通常不是问题,我在Ember.js 在具有身份验证的应用程序中加载公共数据的位置,ember.js,Ember.js,我有一个带有侧栏的应用程序,它总是可见的。对于这个侧边栏,我必须加载一次公共数据。这通常不是问题,我在ApplicationRoute的setupController钩子中执行此操作 Tedian.ApplicationRoute = Ember.Route.extend setupController: -> controller = @controllerFor("sidebar") controller.set "tasks", @store.find("task
ApplicationRoute
的setupController
钩子中执行此操作
Tedian.ApplicationRoute = Ember.Route.extend
setupController: ->
controller = @controllerFor("sidebar")
controller.set "tasks", @store.find("task")
controller.set "projects", @store.find("project")
controller.set "timeEntries", @store.find("timeEntry")
Tedian.TimeEntry.findActive().then (timeEntry) ->
controller.set "activeTimeEntry", timeEntry
但是在具有身份验证的应用程序中,我应该将此设置代码放在哪里?
我不想为未经身份验证的用户运行此代码,因此无法将其放入
ApplicationRoute
。哪里是放置它的最佳位置?您可以在应用程序启动时检查用户是否经过身份验证
App.initializer({
name: 'bootstrap',
initialize: function() {
//if user is authenticated do a $.ajax or 2 in here
}
});
最可能的情况是,您希望有一个与任务、项目和时间输入模型有多个关系的用户模型。然后,当您对用户进行身份验证时,无论您如何进行验证,服务器响应都应该包括那些相关模型 然后,您的SidebarController可以具有当前用户所需的控制器:
App.SidebarController = Ember.Controller.extend({
needs: ["currentUser"]
});
您的边栏模板可以有如下内容
{{render "tasks" currentUser.tasks}}
{{render "projects" currentUser.projects}}
{{render "timeEntries" currentUser.timeEntries}}
当您使用适当的数据设置currentUser时,这些将自动填充
如果您无法控制服务器响应,则可以让currentUserController上的观察者在身份验证后获取这些内容。也许我在这里太笨了,但我只需检查用户是否登录:
App.ApplicationRoute = Ember.Route.extend({
initializeSidebar: function() {
if (!App.user.get('isSignedIn')) return;
var controller = this.controllerFor('sidebar');
//...
}.observes('App.user.isSignedIn'),
setupController: function(controller, model) {
controller.set('model', model);
this.initializeSidebar();
}
});
现在,如果用户登录或用户已经登录,但有关信息是异步提供的,则侧边栏将更新
我不知道直接将用户对象存储在应用程序上是否是一种好的做法,但由于您希望从任何地方访问它,我认为这是可以的。或者,将其作为控制器的一个属性,然后可以通过调用
this.controllerFor(“”)
从ApplicationRoute访问该属性。如何执行身份验证逻辑?使用一些框架或手动操作等。我正在手动操作,类似于此:它将进入App.sessionnewroute createSession操作。当应用启动时我没有经过身份验证,但在启动后我登录时会发生什么?登录不会导致页面加载,因此启动逻辑已经发生。啊,是的-这需要由另一个组件驱动的另一种类型的操作。我的登录控制器会调度一个在应用程序路由
上捕获的事件。谢谢