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

Javascript 创建控制器之前,$resolve未添加到$scope,javascript,angularjs,angularjs-scope,angularjs-routing,Javascript,Angularjs,Angularjs Scope,Angularjs Routing,我正试图利用(1.5.0中新增的)这一特性。然而,似乎直到控制器加载之后,映射才真正添加到作用域中 下面是一个非常简单的模块,演示了这个问题(从这里): 如果观察控制台,您会注意到创建控制器时,$scope.$resolve是未定义的。但是,正如setTimeout所示,它随后立即出现 我在文档中找不到任何东西表明情况应该如此。这是虫子吗?或者我只是没有得到一些关于角度如何工作的基本知识?请注意,您的对象比您预期的要大得多,实际上您的对象位于$resolve上。然而,这主要是通过例子来阐述的 解

我正试图利用(1.5.0中新增的)这一特性。然而,似乎直到控制器加载之后,映射才真正添加到作用域中

下面是一个非常简单的模块,演示了这个问题(从这里):

如果观察控制台,您会注意到创建控制器时,
$scope.$resolve
未定义的
。但是,正如
setTimeout
所示,它随后立即出现


我在文档中找不到任何东西表明情况应该如此。这是虫子吗?或者我只是没有得到一些关于角度如何工作的基本知识?

请注意,您的对象比您预期的要大得多,实际上您的对象位于
$resolve
上。然而,这主要是通过例子来阐述的

解析地图将在路线范围内的 $resolve

无需深入研究,当您
解析
时,命名对象将成为可注入对象,然后您可以将其放置在
$scope
上,在本例中,
解析数据
。注意以下几点

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



调查您为什么得到未定义的
是由于框架中等待摘要周期的性质。获取
$resolve
句柄的可接受解决方法包括在
$timeout
中注入和包装调用,这将强制一个摘要循环,在该循环中,对象将在异步回调中可用。如果这种方法不理想,放弃注入
$timeout
,或者直接为解析对象调用
$route.current.locals
,或者像上面的示例所示,将对象作为命名参数注入,该参数将立即解析。

以防其他人遇到此问题-它已经存在$作用域。$resolve实际上并不用于控制器。您应该注入它,或者使用$route.current.locals


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

正确。解析映射应该在$scope.$resolve中。是的,但只有在控制器创建完成之后,它才真正存在。只需在没有超时的情况下注销
$scope
,然后签出objectNo,它不是。如果您
console.dir($scope)
,它看起来是这样的,因为当您在控制台中实际单击它时,它就在那里了,但是直到加载控制器之后,$resolve才真正添加到$scope中。嗯,似乎没有记录为什么会发生这种情况。你有没有理由不把它称为可注射的?我猜是一个bug,文档确实声明它将等待一个承诺解决,甚至强迫它作为一个不起作用的承诺看到了吗
app.controller('editController', ['$scope', 'resolveData', function($scope, resolveData) {
  console.log(resolveData);
  // -- $scope.data = resolveData; // -- assign it here
}]);