我已经更改了我的 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 来初始化您想要的东西

我敢肯定还有其他选项,具体取决于您的代码结构,但希望这至少能让您入门。祝你好运!


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!