javascript - 如何延迟特定 Controller (不是路由)的实例化?

标签 javascript angularjs model-view-controller asynchronous promise

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

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

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

最佳答案

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

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

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>

关于javascript - 如何延迟特定 Controller (不是路由)的实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18802757/

相关文章:

angularjs - 平均堆栈应用程序的 vs Code 调试

angularjs - 在 Protractor e2e 测试期间独立控制多个浏览器

jquery - 是否可以在正在运行的 mvc 站点中编辑 css 文件?

asp.net-mvc - 如何在 ASP.NET MVC 中编写指向静态文件的链接?

javascript - 让网络浏览器滚动到顶部?

javascript - 要求 js 从 cdn 加载脚本失败

javascript - Angular js 中未选中复选框

javascript - 如何在 Vuejs 中创建动态的两个关系下拉列表

javascript - Ext.ModelManager.getModel 已在 extjs 5 中弃用

javascript - Moltin Cart、Laravel 和 Angular JS – 循环 JS 对象