AngularJS TypeError:无法读取undefined的属性'protocol'

时间:2014-04-03 14:31:39

标签: angularjs

我更改了$ http>我的AngularJS应用程序中的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加载控制器之前调用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)

令人困惑的是,该应用程序工作正常,除了我得到的错误...有人可以告诉我我在这里做错了什么?以及如果应用程序已经正常工作而我收到此错误的原因。

2 个答案:

答案 0 :(得分:2)

这显然是订单的问题。在第一次运行loadUrls调用之后,$http才会被调用。这可能是因为控制器不一定按照您期望的顺序加载 - 在运行其他控制器之前,您无法依靠路由提供程序打开并启动您的主控制器 - 这只取决于如何事情已经确定。鉴于您在此处提供的代码量,很难说出订单究竟出了什么问题。

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

  • 在运行loadUrls()请求之前,请始终致电$http。这不是优雅的,但它会解决问题
  • 将所有$http个来电换行并在该封装中调用loadUrls()。这比前一个略好,因为如果您需要更改loadUrls()或确保只调用一次,您可以在以后实现该逻辑。
  • 您已经注意到了这一点,但您可以将初始化更改为直接在服务中,而不是在服务提供的例程中。这将解决问题,但它可能会让您在每次更改网址时都必须更新服务的地方。
  • 与错误一起生活,知道当控制器加载它时将实例化并在该时间点获取正确的数据。我不经常喜欢这样的解决方案,因为它可能会导致以后难以追查的错误,但如果您不喜欢以前的任何选项,那么从技术上来说这可能是正常的。
  • 使用应用程序配置,该应用程序配置在应用程序加载时执行(请注意,并非所有资源都已初始化且不允许注入)。示例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.
      }).
    

    您可以使用此块或运行块初始化您想要的内容

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

答案 1 :(得分:-1)

我遇到了同样的问题,我通过改变它来修复它:

    var logoutURL = URL + '/logout';
    function sendLogoutHttp(){
        return $http({
            method: 'GET',
            url: logoutURL,
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        });
    }

到这个

    function sendLogoutHttp(){
        var logoutURL = URL + '/logout';
        return $http({
            method: 'GET',
            url: logoutURL,
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        });
    }