如何在AngularJS中重新定义一个模块?

3
我希望在引导程序之后将一个模块附加到主模块。我发现了这个问题:https://github.com/angular/angular.js/issues/3881,这正是我想要的。
他们说:

我不再觉得这是必要的,尽管如果我们重新定义一个模块,看到警告会很好(但即使在测试期间,这也可能是有益的)

我不确定“重新定义一个模块”是什么意思,所以我试着猜测它的含义: html
<div ng-controller="Ctrl">
  {{hi }}
  <input ng-model="hi" />
  <button ng-click="say()">Say</button>
  <ul>
    <li phone="{{p}}" ng-repeat='p in ps'></li>
  </ul>
</div>

您可以看到有一个phone指令。

Angular 代码

angular.module('ctrl',[])
.controller('Ctrl', ['$scope', function($scope){
  $scope.hi = 'Hi';
  $scope.say = function() {
    alert("Say something");
  };
  $scope.ps = ["1234567890123","001122334455667"];
}]);


angular.module('app', ['ctrl']);

angular.element(document).ready(function () {
    angular.bootstrap(document, ['app']);
});

您可以看到目前还没有 phone 的定义。

然后我尝试重新定义 app 模块并添加一个新的 phone 模块:

angular.module('phone', [])
.directive('phone', function() {
  return {
    restrict: "A",
    scope: {
      p : "@phone"
    },
    link: function(scope,el){
      el.text(scope.p.substr(0,5)+"...");
      el.css("cursor", "pointer");
      el.on("click", function(){
        el.text(scope.p);
        el.css("cursor", "text");
      });
    }
  };
});

setTimeout(function() {
    console.log('redefine module');
    angular.module('app', ['ctrl', 'phone']);
}, 3000);

它将在3秒内运行。

但仍然无法正常工作。我不确定我的方法是否正确,如何修复?

你可以在这里看到一个实时演示:http://jsbin.com/xukafo/1/edit


更新:

让我澄清一下。我想要附加到主模块的模块是第三方模块,它已经定义了一些模块和指令。由于它很大且速度较慢,我想异步加载它,并将其附加到主(引导)模块上。我不能修改该模块的源代码。

已经有一个棘手的解决方案:https://dev59.com/4mgu5IYBdhLWcg3w_b9V#18365367

我尝试过那个解决方案,它可以工作,但永远无法通过protractor e2e测试。所以我为“附加模块”创建了一个功能请求,但告诉已经存在一个问题中的功能请求。人们说我们不需要这个功能,因为我们可以“重新定义”一个模块,但我不知道如何“重新定义”它。所以有这个问题。

1个回答

2
重新定义一个模块意味着首先定义一个模块:
angular.module('module1', []);
然后再在其他地方重新定义它:
angular.module('module1', [])
    .config(...);
但是,意图是添加一个.config块(注意.module()使用单个参数调用:)
angular.module('module1')
    .config(...);

如何将一个模块添加到它中? - Freewind
angular.module('module1', []); angular.module('module2', ['module1']); - Steve Lang
感谢@Steve,很抱歉我没有表述清楚。我想附加到主模块的模块是第三方模块,它已经定义了一些模块和指令。由于它很大且速度较慢,我想异步加载它,并将其附加到主(引导)模块。我无法修改该模块的源代码。 - Freewind
好的,我现在明白了。似乎有人已经找到了解决方案:https://dev59.com/4mgu5IYBdhLWcg3w_b9V#18365367 - Steve Lang
我尝试过那个解决方案,它可以工作,但是永远无法通过 protractor 的端到端测试。因此,我创建了一个“附加模块”的功能请求,但被告知已经存在一个(就在问题中)。人们说我们不需要这个功能,因为我们可以“重新定义”一个模块,但我不知道如何“重新定义”它。所以就有了这个问题。 - Freewind
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接