2014-04-27 55 views
0

我有一個Angular應用程序與外部API進行通信。我能夠從Angular $資源調用生成初始視圖。我的問題是我有一個在ng-click上運行函數的表單。該函數然後再次查詢API,並應該更新相同的範圍變量,但我無法獲得第二個$資源調用的結果來更新範圍變量。

在我的控制器,這是最初的呼叫獲取在最初的視圖顯示了數據:

// Initial weather and geolocation data var Weather = $resource('http://example.com/:method'); Weather.get({method: 'current'}).$promise.then(function(weather) { // Success $scope.weather = weather.weather; $scope.geolocation = weather.location; }, function(error) { // Failure $scope.weather = error; });

到目前爲止好,視圖更新和我可以顯示JSON的API將返回{{ weather.currently.temp }}以及{{geolocation}}變量中的所有數據。

不過,我有一個表格(它已正確設置去跟控制器)在提交應使另一個請求相同的API,並返回新的數據:

// Search functionality $scope.weatherLookup = function(query) { $http.get('http://example.com/location/' + query).then(function (value) { $scope.weather = value; }); };

此時在視圖中,{{weather}}變量不會在任何地方更新。完全一樣。如果我在weatherLookup函數中拋出一個console.log函數,我試圖獲得$scope.weather的值時得到undefined,但是當我在同一個console.log()語句中請求value時,我得到一個有效的JSON對象。

我怎樣才能得到value變量分配給$scope.weather裏面$scope.weatherLookup,以便它可以更新該值,並讓它冒泡到視圖?

回答

0

這是我找到的解決方案 - 我歡迎替代/更好的方法來做到這一點。

顯然$scope.weather引用了多個值。也就是說,因爲$ resource和$ http方法返回promise和這些promise的性質,所以$scope.weather實際上可以引用兩個單獨的對象,就視圖和控制器而言。我解決問題的方法是使用$rootScope來確保總是覆蓋相同的weather對象。

這裏的新代碼:

'use strict'; 

angular.module('myApp') 
    .controller('WeatherCtrl', function ($scope, Restangular, $rootScope) { 

    // Get initial weather data (NOW WITH $rootScope) 
    Restangular.one('current').get().then(function(weather) { 
     $rootScope.weather = weather.weather; 
     $scope.geolocation = weather.location; 
    }); 

    // Search functionality 
    $scope.weatherLookup = function(query) { 
     Restangular.one('location/' + query).get().then(function(newWeather) { 
     $rootScope.weather = newWeather; 
     console.log($rootScope.weather); 
     }); 
     console.log($rootScope.weather); 
    }; 

    }); 

從使用角度本身$resource$http服務,以精彩的Restangular庫切換。儘管有這種變化,但原來的問題一直存在,直到我使用了$rootScope。我測試了這個理論,使用$resource$http,它仍然有效,所以我知道問題是$scope.weather在某種程度上被分開,並且由於$scope和承諾在Angular中有效,引用了兩個單獨的對象。