[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端点,并将响应数据返回到前端。
可能是由于['$scope', function($scope, HttpGetter)
?
应改为['$scope', 'HttpGetter', function($scope, HttpGetter)
。
谢谢!它解决了问题! –
@SyedSafir如果这解决了您的问题,那么您应该将此答案标记为已接受,因为它是第一个,其他两个只是这个的副本。 – Ioan
您使用缩小的版本,仅注入$scope
不HttpGetter
而是用作控制器功能,这就是为什么有HttpGetter
是显示无法读取的不确定
财产“getCityData”所以,你应该注入undefiend和错误说法HttpGetter
在缩小的版本['$scope', 'HttpGetter'
使用,如:
app.controller('MainController', ['$scope', 'HttpGetter', function($scope, HttpGetter)
代替
app.controller('MainController', ['$scope', function($scope, HttpGetter)
如果你的MyAppKey
固定并希望从用户隐藏,那么你应该使用它在服务器端
谢谢!它解决了问题!顺便说一句,在方括号内的元素称为注入? –
是的,你说得对。当然也可以明确地定义,这是防止缩小细分的唯一方法。像:'MyController。$ inject = ['$ scope','AnyService'];' – softvar