我已经更改了我的 AngularJS 应用程序中的 $http > URL 参数
$http({ method:'POST',
url:'http://localhost/api/clients.php'
}).success(function(data,status,headers,config){
deferred.resolve(data);
}).error(function(data,status,headers,config){
deferred.reject(status);
});
到
$http({ method:'POST',
url: ConfigService.Urls.Clients
}).success(function(data,status,headers,config){
deferred.resolve(data);
}).error(function(data,status,headers,config){
deferred.reject(status);
});
其中ConfigService如下:
Urls: {},
loadUrls: function(){
Urls.Clients = 'http://localhost/api/clients.php';
}
当然,我在通过 .Resolve 加载 Controller 之前调用了 loadUrls,所以我 100% 确定 Urls.Clients 不为空。
进行此更改后,我开始收到错误消息:
TypeError: Cannot read property 'protocol' of undefined
at urlIsSameOrigin (http://localhost/myapp/app/lib/angular/angular.js:13710:17)
at $http (http://localhost/myapp/app/lib/angular/angular.js:7508:23)
令人困惑的是应用程序工作正常,除了我遇到的那个错误...有人可以告诉我我在这里做错了什么吗?以及如果应用程序已经正常运行,为什么我会收到此错误。
请您参考如下方法:
这显然是顺序问题。 loadUrls
直到 $http
调用第一次运行后才会被调用。这可能是因为 Controller 不一定按您期望的顺序加载 - 您不能指望路由提供商在运行其他 Controller 之前打开并启动您的家庭 Controller - 这将取决于事情的设置方式。鉴于您在此处提供的代码量,很难说出顺序方面到底出了什么问题。
请记住,您有几个通用选项可以解决此问题:
- 总是在运行
$http
请求之前调用loadUrls()
。这不是很优雅,但可以解决问题 - 包装所有的
$http
调用并在该包装器中调用loadUrls()
。这比之前的稍微好一些,因为如果您需要更改loadUrls()
或确保它只被调用一次,您可以稍后实现该逻辑。 - 您已经观察到这一点,但您可以将初始化更改为直接在服务中进行,而不是在服务提供的例程中进行。这将解决问题,尽管它可能会让您在每次 url 更改时都必须更新服务的地方。
- 忍受错误,知道当 Controller 加载时它会在那个时间点实例化并获取正确的数据。我通常不喜欢这样的解决方案,因为它可能会在以后导致难以追踪的错误,但如果您不喜欢之前的任何选项,这在技术上可能没问题。
使用一个应用程序配置,它在应用程序加载时执行(请注意,并非所有资源都被初始化,并且不允许注入(inject))。一个例子 from the documentation :
angular.module('myModule', []). config(function(injectables) { // provider-injector // This is an example of config block. // You can have as many of these as you want. // You can only inject Providers (not instances) // into config blocks. }).
您可以使用这个或运行 block 来初始化您想要的东西
我敢肯定还有其他选项,具体取决于您的代码结构,但希望这至少能让您入门。祝你好运!