何处在具有身份验证的应用程序中加载公共数据

时间:2013-11-21 14:42:38

标签: ember.js

我的应用程序带有始终可见的侧边栏。对于这个侧边栏,我必须加载一次公共数据。这通常不是问题,我在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 。最好放在哪里?

3 个答案:

答案 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('')

从ApplicationRoute访问它。

答案 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上获取认证后的内容。