【问题标题】:$resolve not added to $scope until after controller creation$resolve 直到控制器创建后才添加到 $scope
【发布时间】:2016-02-18 16:16:05
【问题描述】:

我正在尝试利用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 所展示的那样。

我在文档中找不到任何表明应该是这种情况的内容。这是一个错误吗?还是我只是没有了解 Angular 的工作原理?

【问题讨论】:

    标签: javascript angularjs angularjs-scope angularjs-routing


    【解决方案1】:

    万一其他人遇到这个 - 它已经是reported on the angular github and resolved as intended behavior。 $scope.$resolve 并不是真的要在控制器中使用。你应该注入它,或者使用 $route.current.locals。

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

    【讨论】:

      【解决方案2】:

      请注意,您的对象比您预期的要大得多,实际上您的对象位于$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,或者将您的对象作为命名参数注入,如上例所示,它将立即解析。

      【讨论】:

      • 对。解析图应该在 $scope.$resolve 中。确实如此,但只有在控制器创建完成之后。
      • 它确实存在。在没有超时的情况下仅注销$scope 并检查该对象
      • 不,不是。如果你 console.dir($scope) 看起来是这样,因为它在你可以在控制台中实际单击它时就在那里,但在控制器加载之前,$resolve 并没有真正添加到 $scope。
      • 好吧,似乎没有记录为什么会发生这种情况。你有什么理由不把它称为注射剂吗?
      • 我的猜测是一个错误,文档确实声明它会等待一个承诺解决,甚至强制作为一个承诺它不起作用,请参阅this plunker
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      相关资源
      最近更新 更多