所以我有一个我创建的模块,它可以实现某种状态"状态"为我路由。我制作了自己的小版本以获得我的确切预期效果,它似乎工作得很好,直到我将其插入单独的模块进行测试。
我将它注入2个独立的模块,在我需要使用它的每个模块的.config中定义信息,然后在控制器中调用它以使用我的更改状态效果。
在我将其插入单独的模块之前,它一直很顺利,而现在似乎正在发生的是我创建的用于处理所有这些的模块是为每个模块创建单独的实例。让我告诉你我的意思:
以下是使用它进行测试的其中一个模块的示例 -
angular.
module('urlTesting2', [ 'urlTesting'])
.config(function($moduleObjectProvider) {
var callback = function(name, obj) {
console.log(name, obj);
}
$moduleObjectProvider.$get().set("module2", callback)
.addState("calender", ["day", "week", "month"]);
}).controller("testControl2", function($scope, checkUrl) {
$scope.addSecond = function() {
checkUrl.goState("module2", "calender", ["yes", "no", "maybe"]);
}
});
因此它被注入,并且在配置中我调用提供者并设置具有状态的新模块。在控制器中我只是调用goState。这本身就很有效。问题是当我添加一个单独的模块时也这样做。我这里有一个小提琴显示问题 -
https://jsfiddle.net/7hn3ovgz/1/
所以 - 我喜欢在我自己的浏览器窗口中测试它,但是小提琴似乎是分享这个的最简单方法。它不会更改浏览器中的实际网址,但仍会记录所有效果。
基本上我认为发生的事情就是当我点击模块中的状态改变时,它会触发两次并在另一个模块中查找状态(也就是那里)。我想要的效果是所有设置配置的模块都在一个地方。因此,当您执行.set时 - 它只是将对象添加到提供程序中名为currentModules的变量中。似乎配置正在设置单独的实例(如闭包),而不是将所有配置集()推送到一个大对象中以供参考。
道歉,如果不清楚,希望小提琴能够清楚地显示出来,并且感谢您花时间阅读。
答案 0 :(得分:0)
似乎问题是提供者的注入器,每次调用它时都会创建该函数的新实例,所以你应该做的就是切换
function $moduleObjectProvider() {
var currentModules = {};
到
var currentModules = {};
function $moduleObjectProvider() {
或重构提供者,如果可能,不要将其作为注入函数