【问题标题】:Angular JS delay controller and directive initialization until data is returned from serverAngular JS 延迟控制器和指令初始化,直到从服务器返回数据
【发布时间】:2013-05-25 06:14:07
【问题描述】:

我的 AngularJS 应用程序需要一些来自服务器的元数据才能初始化控制器和一些指令。我有一项服务可以返回数据,但无法让控制器和指令等待数据。

myapp.factory("db",["$http",function($http)
{
  var db = {};

  db.metadata = function(callback)
  {
    $http.jsonp("/db/?f=metadata&callback=JSON_CALLBACK").success(function(data)
    {
      callback(data);
    }).error(function(error)
    {
      console.log(error);
    });
  }
  ...
  return db;
}]);


var myctrl = myapp.controller("MyCtrl",["$scope","$location","db",function($scope,$location,db)
{
  db.metadata(function(data)
  {
    $scope.metadata = data;
    // initialize $scope members with $scope.metadata for directives
     ...
  });
}]);

这显然行不通,因为指令会在调用 db.metadata() 返回之前尝试使用未定义的 $scope 成员进行初始化。我试过使用 $routeProvider 解析属性:

myapp.config(["$routeProvider",function($routeProvider)
{
  $routeProvider.when("/",{
    templateUrl: "./myview.html",
    controller: "MyCtrl",
    resolve: {
      metadata: ["db","$q",function(db,$q)
      {
        var deferred = $q.defer();

        db.metadata(function(data)
        {
          deferred.resolve(data);
        });

        return deferred.promise;
      }]
    }
  });
}]);

var myctrl = myapp.controller("MyCtrl",["$scope","$location","db","metadata",function($scope,$location,db,metadata)
{
  $scope.metadata = metadata;
  // initialize $scope members with $scope.metadata for directives
  ...
}

这不会运行,因为注入数组中“元数据”的缩小友好声明会导致 Angular 呕吐。删除声明会导致注入的元数据未定义。我做错了什么?

【问题讨论】:

  • 当 Angular “呕吐”时,你到底遇到了什么错误,为什么你将控制器分配给全局变量 (myctrl),而你可以在你的 routeProvider 中简单地将控制器引用为 controller: 'MyCtrl'
  • Stewie,错误是:错误:未知提供者:metadataProvider
  • 如何缩小代码?你能检查你的解析对象是否在缩小文件中被破坏。您可以尝试在解析对象中使用字符串化键,看看是否有帮助 (resolve: {'metadata': ...})。我将 r.js 与 uglify2 优化器一起使用,它并没有破坏我的路由模块,但您的优化器可能不是这种情况。
  • 还没有考虑缩小,仍在开发中,所以这不是缩小问题。

标签: javascript angularjs angularjs-directive angularjs-service angularjs-controller


【解决方案1】:

问题原来是html还是有

<div ng-controller="MyCtrl">

不需要,因为“MyCtrl”是通过 $routeProvider 配置为 myview.html 分配控制器的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-03
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2014-12-02
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多