Javascript 如何延迟特定控制器(不是路由)的实例化?

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可以是父范围的任何承诺。 我知道有一种方法可以延迟路由控制器的实例化(这里的答案是:)

我希望有一个像典型ng控制器一样的指令,但我希望在承诺解决后调用它,而不是更早。 在HTML中,可以这样编写:

<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-因为该指令创建了一个子作用域。