我已经从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不为null。

完成此更改后,我开始出现错误:
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 之前打开和启动home Controller -这将仅取决于设置方式。考虑到您在此处提供的代码量,很难说到底是哪里出错了。

请记住,您有一些常规选项可以解决此问题:

  • 在运行loadUrls()请求之前,请始终调用$http。这不是很优雅,但可以解决
  • 问题
  • 打包所有$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.
      }).
    

    您可以使用此代码或运行代码块初始化所需的内容

  • 我确定还有其他选择,具体取决于代码的结构,但希望这至少可以帮助您入门。祝你好运!

    08-28 09:37