在创建控制器之前,$ resolve未添加到$ scope

时间:2016-02-18 16:16:05

标签: javascript angularjs angularjs-scope angularjs-routing

我试图利用adds the resolve map to the scope of the route中的(1.5.0新增功能)功能。但是,在控制器加载之前,似乎地图实际上并未添加到范围中。

这是一个非常简单的模块,用于演示此问题(来自此plunk):

var app = angular.module("app", ['ngRoute']);

app.config(['$routeProvider', '$locationProvider',
  function($routeProvider, $locationProvider) {

    $routeProvider.otherwise({
      controller: "editController",
      controllerAs: "ec",
      templateUrl: "edit.html",
      resolve: {
        resolveData: function() {
          return {
            foo: "bar",
            blah: "halb"
          }
        }
      }

    });
  }
]);

app.controller("editController", ["$scope", function($scope) {
  // undefined
  console.log($scope.$resolve);
  setTimeout(function() {
    // the object is there, including $scope.$resolve.resolveData
    console.log($scope.$resolve);
  }, 0)
}]);

如果您观看控制台,则在创建控制器时,您会注意$scope.$resolveundefined。然而,正如setTimeout所示,它立即发生在那里。

我无法在文档中找到任何暗示应该是这种情况的内容。这是一个错误吗?或者我只是没有得到关于角度如何工作的基本信息?

2 个答案:

答案 0 :(得分:0)

请注意,您的对象比预期的要大得多,实际上您的对象位于$resolve上。这主要是explained in the docs,但是,可以通过示例更精细......

  

解析图将在路径范围内可用   $决心

无需深入研究,当您resolve时,命名对象变为注射对象,然后您可以放置​​$scope,在本例中为resolveData。请注意以下内容......

app.controller('editController', ['$scope', 'resolveData', function($scope, resolveData) {
  console.log(resolveData);
  // -- $scope.data = resolveData; // -- assign it here
}]);

Plunker - 更新了演示

调查您获得undefined的原因是由于等待框架中的摘要周期的性质。获得$resolve句柄的可接受的解决方法包括在$timeout中注入和包装调用,这会强制在异步回调中对象可用的摘要周期。如果这种方法不理想,请放弃注入$timeout并直接为已解析的对象调用$route.current.locals,或者将对象作为命名参数注入,它将立即解析,如上例所示。< / p>

答案 1 :(得分:0)

如果其他人遇到此问题 - 它已经是reported on the angular github and resolved as intended behavior。 $ scope。$ resolve真的意味着在控制器中使用。你应该注入它,或者使用$ route.current.locals。

(或者你可以使用$ scope。$ resolve在$ timeout中包装代码。)