Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 在具有身份验证的应用程序中加载公共数据的位置_Ember.js - Fatal编程技术网

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操作。当应用启动时我没有经过身份验证,但在启动后我登录时会发生什么?登录不会导致页面加载,因此启动逻辑已经发生。啊,是的-这需要由另一个组件驱动的另一种类型的操作。我的登录控制器会调度一个在
应用程序路由
上捕获的事件。谢谢