Angular应用加载两个服务时崩溃:仅单个服务可正常运行
问题根源:重复创建Angular模块导致覆盖
嘿,这问题其实挺典型的!你遇到的情况核心原因是两个服务都在重复创建同一个Angular模块,后加载的服务直接把先加载的模块给覆盖了,自然只能留下最后生效的那个服务。
你看两个服务的代码开头,都写了:
angular.module('nutricia.services', [])
这里的第二个参数[]是在告诉Angular:「帮我创建一个全新的nutricia.services模块,它没有依赖」。所以当第二个服务加载时,它会把第一个已经创建好的nutricia.services模块完全替换掉,最终就只能有一个服务能正常工作。
解决方案:获取已存在的模块,而非重复创建
只需要把第二个服务里的模块声明改成不带第二个参数的形式,这样Angular就会去获取已经存在的nutricia.services模块,而不是重新创建:
修改后的KwaaltjestestService代码
(function() { 'use strict'; // 去掉[],获取已存在的nutricia.services模块 angular.module('nutricia.services') .service('KwaaltjestestService', function($http, $q) { var getKwaaltjes = function (params) { var deferred = $q.defer(); $http({ method: 'GET', url: 'https://www.nutriciavoorjou.nl/mvc/allergytest/' + params }).then(function successCallback(response) { deferred.resolve(response.data); }, function errorCallback(response) { // 建议这里补充错误处理,比如deferred.reject(response),方便调用方捕获异常 }); return deferred.promise; }; return { getKwaaltjes: getKwaaltjes }; }) })();
第一个服务代码保持不变
它是第一个创建nutricia.services模块的,带[]的写法没问题:
(function() { 'use strict'; // 带[]表示创建新模块,作为模块的初始化声明 angular.module('nutricia.services', []) .service('LoginService', function($http) { var login = function (apiUrl, apiKey, loginID, password) { return $http({ method: "POST", url: apiUrl + "?apiKey=" + encodeURIComponent(apiKey) + "&loginID=" + encodeURIComponent(loginID) + "&password=" + encodeURIComponent(password) }); }; var logout = function (apiUrl, apiKey, UID) { return $http({ method: "POST", url: apiUrl + "?apiKey=" + encodeURIComponent(apiKey) + "&UID=" + encodeURIComponent(UID) }); }; return { login: login, logout: logout }; }) })();
另外提个小细节:你的KwaaltjestestService里的错误回调是空的,建议补充deferred.reject(response),这样调用这个服务的代码才能捕获到错误信息,做对应的异常处理。
修改完成后,两个服务会被注册到同一个模块下,同时加载也不会互相覆盖,控制器的代码不需要改动——它们的模块都是独立创建的,本身没有问题。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

