2016-04-21 139 views
-3

這個問題之前已經問過很多次了,我試過了答案,但它們似乎並沒有解決我面臨的問題。我是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」只要是安全的,但我的代碼包含應用程序鍵適當的鑰匙。另外,如果我能夠深入瞭解函數調用是如何發生的,那麼這將非常有幫助,因爲似乎有很多函數調用發生。

回答

0

獲取undefined可能是因爲服務沒有得到適當的注入。

嘗試:

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

而且如你所說,是在安全方面沒有使用正確的密鑰,但使用你的應用程序任何人都可以得到通過檢查網絡調用的關鍵。因此,理想情況下,應該對後端進行調用,並且後端會將安全密鑰和呼叫一起發送到所需的API端點,並將響應數據返回到前端。

+0

謝謝!它解決了問題!順便說一句,在方括號內的元素稱爲注入? –

+0

是的,你說得對。當然也可以明確地定義,這是防止縮小細分的唯一方法。像:'MyController。$ inject = ['$ scope','AnyService'];' – softvar

0

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

應改爲['$scope', 'HttpGetter', function($scope, HttpGetter)

+0

謝謝!它解決了問題! –

+0

@SyedSafir如果這解決了您的問題,那麼您應該將此答案標記爲已接受,因爲它是第一個,其他兩個只是這個的副本。 – Ioan

0

您使用縮小的版本,僅注入$scopeHttpGetter而是用作控制器功能,這就是爲什麼有HttpGetter是顯示無法讀取的不確定

財產「getCityData」所以,你應該注入undefiend和錯誤說法HttpGetter在縮小的版本['$scope', 'HttpGetter'

使用,如:

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

代替

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

如果你的MyAppKey固定並希望從用戶隱藏,那麼你應該使用它在服務器端

相關問題