0

我很确定必须有一个优雅的解决方案来解决这个角度的模式,我只是看不到它。

问题:

  • 所有数据在应用程序启动时批量加载一次。
  • /#/users/13用户通过输入 URL请求特定视图(如)
  • 问题:数据尚未加载

服务器

我的后端服务器一次从其所有表中返回所有可用数据(它不多)作为 JSON

{users: [...], groups: [...], stuff: [...], ...}

服务

我将它包装在一个带有update()Method 的 Angular 服务中,如果成功,它将把响应的元素放入 中$rootScope,因为这就是整个应用程序正在处理的内容:

.success(function (data) {
    $rootScope.users = data.users;
    $rootScope.groups = data.groups;
    ...
}

一旦应用程序启动,就会在 mainController 中调用 update 方法。

控制器/视图

当我为某个用户创建视图时,例如/users/:id,在应用程序内部导航时一切正常。到目前为止,一切都很好。

当我用一个像这样的视图的深层链接启动应用程序时#/users/13,数据还没有加载,所以控制器不能像往常一样链接数据,导致错误:

$scope.user = $scope.users[$routeParams.id];

想法

我必须解决的所有想法都以某种方式存在问题。

  • 对控制器中的未定义做出反应$scope.users可以避免错误,但是一旦数据存在,我将如何重新加载视图?
  • 为路由设置resolve一个依赖于该服务结果承诺的部分,每次使用路由时都会重新加载,即使数据已经加载(数据应该只在应用程序启动时加载)
  • 为每个数据部分设置服务并在每个结果上使用 promise 会从服务器多次获取数据
  • 为“数据已加载”设置显式标志并根据其状态更改内容对我来说似乎完全错误
  • 使用 Promise 通常让我有些头疼,因为只有一大堆获取的数据,但我们想引用它的单个元素

所以我担心我只是错过了这种设置的“角度方式”(可能只是瞎了眼)。

4

1 回答 1

1

如果您有应该始终加载的数据,您可以将其加载到您的应用程序“app.run”中。这总是在其他任何事情之前完成。它不会让您不必等待 http-requests,因为它仍然是异步的,但是您可以使用它来确保始终从服务器加载数据(并且只加载一次,因为 app.run 只运行一次)。获得数据后,您可以将其存储在服务或 rootScope 中,以便控制器和其他人可以使用它。

这负责确保加载数据的调用始终运行并且只运行一次。第二部分将等待数据,因为我仍然会使用解析。

  1. 检查服务或 rootScope 以查看数据是否已存在。
  2. 如果确实如此,那就太好了。
  3. 如果没有,请使用手表等待。
  4. 当 promise 解决后,显示视图。

通过将数据存储在服务中,我的意思是使用以下内容:

app.factory('DataObject', [function(){
  return {};
}]);

服务是单例的,所以使用这个对象的任何东西都将共享相同的数据。所以解析可以依赖它并使用它来检查数据是否存在。您也可以将 rootScope 用于同一件事,但使用服务可以避免在 rootScope 中乱扔垃圾。rootScope 更容易观察。


编辑:如果您想在数据准备就绪的情况下检查控制器,那么您希望$scope.$watch在数据加载后触发事件。

于 2013-11-14T14:24:31.003 回答