Javascript 如何延迟特定控制器(不是路由)的实例化?
我希望有一个像典型ng控制器一样的指令,但我希望在承诺解决后调用它,而不是更早。 在HTML中,可以这样编写:Javascript 如何延迟特定控制器(不是路由)的实例化?,javascript,angularjs,model-view-controller,asynchronous,promise,Javascript,Angularjs,Model View Controller,Asynchronous,Promise,我希望有一个像典型ng控制器一样的指令,但我希望在承诺解决后调用它,而不是更早。 在HTML中,可以这样编写: <div ng-controller="myCtrl" ctrl-promise="p"> <div delay-controller="MyCtrl" delay-controller-promise="myPromiseExpr()"> </div> p可以是父范围的任何承诺。 我知道有一种方法可以延迟路由控制器的实例化(这里的答案是:)
<div ng-controller="myCtrl" ctrl-promise="p">
<div delay-controller="MyCtrl" delay-controller-promise="myPromiseExpr()">
</div>
p可以是父范围的任何承诺。
我知道有一种方法可以延迟路由控制器的实例化(这里的答案是:),但我更喜欢按控制器而不是按路由指定。
我知道我可以使用ng if和p作为阿曲布他,但还有其他方法吗?那么你想让div中的东西存在,只是不需要控制器控制它,直到承诺得到解决 以下是一条指令,该指令将在承诺得到解决时创建控制器:
angular.module('myApp')
.directive('delayController', function($controller, $q) {
return {
scope: true,
link: function(scope, elm, attr) {
$q.when(scope.$parent.$eval(attr.delayControllerPromise)).then(function() {
var ctrl = $controller(attr.delayController, {
$scope: scope
});
elm.children().data('$ngControllerController', ctrl);
});
}
};
});
您可以这样使用它:
<div ng-controller="myCtrl" ctrl-promise="p">
<div delay-controller="MyCtrl" delay-controller-promise="myPromiseExpr()">
</div>
当我的控制器函数位于父作用域上时,这项功能就起作用了,但当我使用常规的angular.module('app',[])定义它时,控制器('myCtrl',…)显然不会将其注入到父作用域中。我尝试通过调用$injector.get(attr.delayController)来注入它,但这只是返回了一个错误:未知提供者:MyCtrlProvider我应该在认为它需要函数之前阅读文档。谢谢你留下来!我在范围方面有问题。$eval(attr.delayControllerPromise)。在plnkr中,它解析为未定义对象,而不是承诺对象,因此控制器根本不延迟。为什么?我甚至尝试创建一个父控制器,在那里我也存储了承诺,但是运气不好…尝试scope.$parent.$eval-因为该指令创建了一个子作用域。