2016-09-23 54 views
0

我在從控制器獲取服務中的值時遇到問題。我的服務是這樣的:角度服務沒有像預期的那樣暴露價值

angular.module('someApp').factory('someSvc', SomeSvc); 

function SomeSvc($http) { 
    var colors = []; 
    function loadColors() { 
     return $http.get('SomeApi/GetColors') 
      .then(function (result) { 
       //colors = result.data.colors;//<-this doesn't work 
       //angular.copy(result.data.colors, colors);//<-this works 
      }); 
    } 
    return { 
     loadColors: loadColors, 
     colors: colors 
    }; 
} 

然後我的控制器可以作出這樣一個電話:

someSvc.loadColors().then(function(){vm.colors = someSvc.colors;}); 

所以,當我調試,如果我在控制器中設置一個斷點,其中分配給虛擬機。顏色,someService對象上暴露的colors屬性只有一個空數組或具有期望值的任何數組,取決於我在服務中使用的兩條註釋掉的行。

如果我在爲顏色賦值的服務中設置了一個斷點,那麼變量顏色總是有預期的值(例如,讓我們說[「red」,「yellow」,「green」]是返回的來自http調用)。所以我可以看到控制器觸發http調用,觀察值返回並分配給服務中的顏色,但是除非我做了angular.copy調用,否則控制器只會看到一個空陣列。

另外,有趣的是,如果我改變了服務的return語句是這樣的:

return { 
    loadColors: loadColors, 
    colors: function() {return colors;} 
}; 

,然後在控制器說vm.colors = someSvc.colors();那麼這工作也很不錯。

這是爲什麼?爲什麼數組沒有通過?

更新: 我發現,而不是angular.copy()行,我可以交替做,一切都按預期工作:

for (var i = 0; i < result.data.colors.length; i++) { 
    colors[i] = result.data.colors[i]; 
} 

這似乎是分配對象一個問題,而修改它是好的?這是爲什麼?

回答

1

這可能適用於你。猜測這可能只是一個指針問題?

angular.module('someApp') 

.factory('someSvc', function($http) 
{ 
    return { 
    colors: [], 
    loadColors: function() 
    { 
     var self = this; 

     return $http.get('SomeApi/GetColors').then(function (result) 
     { 
     self.colors = result.data.colors; 
     }); 
    } 
    }; 
}); 
+0

這有效,但我不明白爲什麼。 – ctb

+0

關鍵是var self = this; - 確保在數據返回時指向正確的顏色對象。 – gmustudent

+0

是的,但爲什麼它沒有指向沒有這個引用的正確對象?爲什麼我做一個賦值操作或更新引用(例如使用angular.copy()或手動for循環選項)會有所作爲? – ctb

0

在你在你的工廠調用return時間,someSvc.colors只是空數組 - 和返回值。由於角提供者通常只嘗試運行一次,將來它不會實際再次檢查someSvc.colors - 僅返回初始值。

將其包裝在一個函數中意味着它每次都運行該函數,因此它會提取更新後的值。

+0

如果是這種情況,爲什麼其他行會使它工作:'angular.copy(...)' – ctb

相關問題