[JavaScript] [Angular]:TypeError:无法读取未定义的属性'getCityData'

[JavaScript] [Angular]:TypeError:无法读取未定义的属性'getCityData'

问题描述:

这个问题之前已经问过很多次了,我试过了答案,但它们似乎并没有解决我面临的问题。我是Angular的新手,并试图将控制器的值传递给工厂,以便通过API检索一些JSON信息。虽然我能够从我的HTML获取值到控制器,但下一步是给我一个TypeError:无法读取未定义的属性'getCityData'。我的控制器代码如下:[JavaScript] [Angular]:TypeError:无法读取未定义的属性'getCityData'

app.controller('MainController', ['$scope', function($scope, HttpGetter) { 

var successFunction = function(data) { 
     $scope.data = data; 
    } 

    var errorFunction = function(data) { 
     console.log("Something went wrong: " + data); 
    } 

    $scope.cityName = ''; 
    $scope.getCityName = function(city) { 
     $scope.cityName = city; 
     HttpGetter.getCityData($scope.cityName, successFunction, errorFunction); 
    }; 
}]); 

工厂代码如下:

app.factory('HttpGetter', ['$http', function($http){ 

return { 
     getCityData: function(query, successFunction, errorFunction){ 
      return $http.get('http://api.apixu.com/v1/current.json?key=MyAppKey&q=' + query). 
      success(successFunction). 
      error(errorFunction); 
     } 
    }; 
    }]); 

我已经更换了我的字符串“MyAppKey”只要是安全的,但我的代码包含应用程序键适当的钥匙。另外,如果我能够深入了解函数调用是如何发生的,那么这将非常有帮助,因为似乎有很多函数调用发生。

获取undefined可能是因为服务没有得到适当的注入。

尝试:

app.controller('MainController', ['$scope', 'HttpGetter', function($scope, HttpGetter) 

而且如你所说,是在安全方面没有使用正确的密钥,但使用你的应用程序任何人都可以得到通过检查网络调用的关键。因此,理想情况下,应该对后端进行调用,并且后端会将安全密钥和呼叫一起发送到所需的API端点,并将响应数据返回到前端。

+0

谢谢!它解决了问题!顺便说一句,在方括号内的元素称为注入? –

+0

是的,你说得对。当然也可以明确地定义,这是防止缩小细分的唯一方法。像:'MyController。$ inject = ['$ scope','AnyService'];' – softvar

可能是由于['$scope', function($scope, HttpGetter)

应改为['$scope', 'HttpGetter', function($scope, HttpGetter)

+0

谢谢!它解决了问题! –

+0

@SyedSafir如果这解决了您的问题,那么您应该将此答案标记为已接受,因为它是第一个,其他两个只是这个的副本。 – Ioan

您使用缩小的版本,仅注入$scopeHttpGetter而是用作控制器功能,这就是为什么有HttpGetter是显示无法读取的不确定

财产“getCityData”所以,你应该注入undefiend和错误说法HttpGetter在缩小的版本['$scope', 'HttpGetter'

使用,如:

app.controller('MainController', ['$scope', 'HttpGetter', function($scope, HttpGetter) 

代替

app.controller('MainController', ['$scope', function($scope, HttpGetter) 

如果你的MyAppKey固定并希望从用户隐藏,那么你应该使用它在服务器端