我试图利用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.$resolve
为undefined
。然而,正如setTimeout
所示,它立即发生在那里。
我无法在文档中找到任何暗示应该是这种情况的内容。这是一个错误吗?或者我只是没有得到关于角度如何工作的基本信息?
答案 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中包装代码。)