【问题标题】:How to delay instantion of a specific controller(not a route)?如何延迟特定控制器(不是路由)的实例化?
【发布时间】:2013-09-15 01:06:23
【问题描述】:

我想要一个表现得像典型的 ng-controller 的指令,但我希望它在 promise 被解决后被调用,而不是更早。 在 HTML 中可以这样写:

<div ng-controller="myCtrl" ctrl-promise="p">

p 可以是父作用域上的任何承诺。 我知道有一种方法可以延迟路由控制器的实例化(如在此处回答:Angular.js delaying controller initialization),但我更愿意为每个控制器而不是每个路由指定这个。 我知道我可以使用 ng-if 和 p 作为属性,但是还有其他方法吗?

【问题讨论】:

    标签: javascript angularjs model-view-controller asynchronous promise


    【解决方案1】:

    所以你希望 div 中的东西存在,只是没有控制器控制它,直到 promise 被解决?

    这是一个指令,它将在 promise 被解决时创建一个控制器:

    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 delay-controller="MyCtrl" delay-controller-promise="myPromiseExpr()">
    </div>
    

    【讨论】:

    • 当我在父作用域上有我的控制器功能时有效,但是当我用常规 angular.module('app', []).controller('myCtrl', ...) 定义它时它显然不会在那里注入它。我曾尝试通过调用 $injector.get(attr.delayController) 来注入它,但这只会返回一个错误:Unknown provider: MyCtrlProvider
    • 在我认为它需要一个函数之前,我应该阅读文档docs.angularjs.org/api/ng.$controller。感谢您的陪伴!
    • 我遇到了 scope.$eval(attr.delayControllerPromise) 的问题。在 plnkr 中,它解析为 undefined 而不是 promise 对象,因此控制器根本不会延迟。为什么??我什至尝试创建一个父控制器来存储我的承诺,但没有运气......
    • 尝试 scope.$parent.$eval - 因为该指令创建了一个子范围。
    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2020-06-15
    相关资源
    最近更新 更多