【问题标题】:AngularJS, resolve data before showing viewAngularJS,在显示视图之前解析数据
【发布时间】:2013-03-06 09:30:33
【问题描述】:

这个主题已经被问过了,但我不知道在我的情况下该怎么做。

使用 AngularJS 1.0.5

在显示“登录”视图之前,我想在未从 AJAX 请求加载数据时获取一些数据并延迟视图呈现。

这里是主要代码。这是好方法吗?

angular.module('tfc', ['tfc.config', 'tfc.services', 'tfc.controllers']).config([
 '$routeProvider', '$locationProvider', '$httpProvider',
 function($routeProvider, $locationProvider, $httpProvider) {
  $routeProvider.when('/login', {
    templateUrl: 'views/login.html',
    controller: "RouteController",
    resolve: {
      data: function(DataResolver) {
        return DataResolver();
      }
    }
  });
}
]);

module_services = angular.module("tfc.services", []);

module_services.factory("DataResolver", [
 "$route", function($route) {
  console.log("init");
  return function() {
    // Tabletop is a lib to get data from google spreadsheets
    // basically this is an ajax request
    return Tabletop.init({
      key: "xxxxx",
      callback: function(data, tabletop) {
        console.log("[Debug][DataResolver] Data received!");
        return data;
      }
    });
  };
 }
]);

【问题讨论】:

  • 也许 AngularJS 的创造者的回答可以帮助你:stackoverflow.com/a/11972028/449162
  • 您还可以将 AJAX 请求的结果分配给 $scope 中的某个内容,然后在 HTML 中使用 ng-show。
  • 这是一种非常可靠的方法。它比使用 ng-show 或 ng-hide 要好得多,因为在您的控制器中,您已经拥有数据并且可以编写更多同步代码。也就是说,这比 SO 更适合代码审查网站,因为您没有问题,而是在寻找代码中的改进。
  • @L42y Misko 也问了这个问题。

标签: javascript angularjs


【解决方案1】:

AngularJS 的重点是您可以加载模板和所有内容,然后等待数据加载,这意味着是异步的。

你的视图应该使用 ng-hide, ng-show 来检查控制器的范围,这样当范围内的数据更新时,视图就会显示出来。您还可以显示一个微调器,这样用户就不会觉得网站崩溃了。

【讨论】:

  • 当您加载要在视图上显示的数据时,我明白您的意思,但您可能需要根据异步加载取消路由
【解决方案2】:

回答这个问题,在呈现视图之前显式加载数据的方式似乎是正确的。请记住,它可能不会提供最佳体验,因为需要一些时间来解决这个问题,可能会给人一种您的应用停止了一段时间的印象。

查看John Pappa's blog 的示例,在使用 Angular 的默认路由器解析路由之前加载一些数据:

// route-config.js
angular
    .module('app')
    .config(config);

function config($routeProvider) {
    $routeProvider
        .when('/avengers', {
            templateUrl: 'avengers.html',
            controller: 'Avengers',
            controllerAs: 'vm',
            resolve: {
                moviesPrepService: function(movieService) {
                    return movieService.getMovies();
                }
            }
        });
}

// avengers.js
angular
    .module('app')
    .controller('Avengers', Avengers);

Avengers.$inject = ['moviesPrepService'];
function Avengers(moviesPrepService) {
    var vm = this;
    vm.movies = moviesPrepService.movies;
}

您基本上在路由上使用resolve 参数,以便 routeProvider 在实例化控制器之前等待所有承诺得到解决。请参阅docs 了解更多信息。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多