我在從控制器獲取服務中的值時遇到問題。我的服務是這樣的:角度服務沒有像預期的那樣暴露價值
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];
}
這似乎是分配對象一個問題,而修改它是好的?這是爲什麼?
這有效,但我不明白爲什麼。 – ctb
關鍵是var self = this; - 確保在數據返回時指向正確的顏色對象。 – gmustudent
是的,但爲什麼它沒有指向沒有這個引用的正確對象?爲什麼我做一個賦值操作或更新引用(例如使用angular.copy()或手動for循環選項)會有所作爲? – ctb