【问题标题】:Assure that the data is loaded in a view without an individual request确保在没有单独请求的情况下将数据加载到视图中
【发布时间】:2013-11-14 14:04:50
【问题描述】:

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

问题:

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

服务器

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

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

服务

我使用 update() 方法将其包装在一个角度服务中,成功后会将响应的元素放入 $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 通常让我有些头疼,因为只有一大块获取的数据,但我们想引用其中的单个元素

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

【问题讨论】:

  • 当我使用深层链接启动应用程序时 --- 角度如何加载?

标签: javascript angularjs


【解决方案1】:

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

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

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

通过将数据存储在服务中,我的意思是使用这样的东西:

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

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


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

【讨论】:

  • 这让我更接近我的需要,但仍然存在在实际加载时请求视图时触发额外数据请求的问题。
  • 我将对此添加一条新评论。
  • 顺便说一句,这些数据是应该始终加载,还是应该只在某些路线上加载?
  • 更新了答案。本质上,使用 app.run 调用数据,然后使用 resolve 等待它完成。在我工作的地方,我们使用它在登录时加载用户数据,以确保我们始终可以使用它。
猜你喜欢
  • 2017-11-02
  • 2011-05-03
  • 2022-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 2016-03-13
相关资源
最近更新 更多