我的应用程序带有始终可见的侧边栏。对于这个侧边栏,我必须加载一次公共数据。这通常不是问题,我在setupController
的{{1}}挂钩中执行此操作。
ApplicationRoute
但是,我将这个设置代码放在具有身份验证的应用程序中?
我不想为未经身份验证的用户运行此代码,因此我无法将其放入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
。最好放在哪里?
答案 0 :(得分:1)
也许我在这里太傻了,但我会检查用户是否登录:
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('')
答案 1 :(得分:0)
您可以检查用户在应用程序启动时是否已通过身份验证
App.initializer({
name: 'bootstrap',
initialize: function() {
//if user is authenticated do a $.ajax or 2 in here
}
});
答案 2 :(得分:0)
最有可能的是,您希望拥有一个与您的Task,Project和TimeEntry模型有多个hasMany关系的User模型。然后,当您对用户进行身份验证时,无论如何,服务器响应应包括那些相关模型。
然后您的SidebarController可以为当前用户提供控制器:
App.SidebarController = Ember.Controller.extend({
needs: ["currentUser"]
});
您的侧边栏模板可以有类似
的内容{{render "tasks" currentUser.tasks}}
{{render "projects" currentUser.projects}}
{{render "timeEntries" currentUser.timeEntries}}
当您使用适当的数据设置currentUser时,这些将自动填充。
如果您无法控制服务器响应,那么您可以让一个观察者在currentUserController上获取认证后的内容。