У меня проблема с получением значений в моем сервисе от контроллера. Моя служба выглядит следующим образом:Угловое обслуживание, не отображающее значения, как ожидалось
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;});
Так что, когда я отладки, если я поставил точку останова в контроллере, где присваивание Vm. цвета, свойство colors, выставленное на объекте someService, имеет только пустой массив или любой массив с ожидаемыми значениями в зависимости от того, какая из двух строк с комментариями я использую в сервисе.
Если я установил точку останова в службе, в которой выполняется присвоение цветов, переменные цвета всегда имеют ожидаемые значения (например, скажем, [«красный», «желтый», «зеленый»] - это то, что возвращается от http-вызова). Поэтому я могу наблюдать, как контроллер запускает HTTP-вызов, наблюдая, как возвращается значение и получает назначение в цветах в службе, но тогда контроллер просто видит пустой массив, если я не выполняю этот вызов угловой.copy.
Кроме того, интересно, если я изменю обратное заявление сервиса, чтобы выглядеть следующим образом:
return {
loadColors: loadColors,
colors: function() {return colors;}
};
, а затем в контроллере говорит vm.colors = someSvc.colors();
то, что работает просто отлично, а также.
Почему это? Почему этот массив не проходит?
UPDATE: Я обнаружил, что вместо линии angular.copy(), я могу сделать это в качестве альтернативы, и все работает, как ожидалось:
for (var i = 0; i < result.data.colors.length; i++) {
colors[i] = result.data.colors[i];
}
Казалось бы, что назначение объекта является проблема, в то время как его изменение в порядке? Почему это?
Это работает, но я не понимаю, почему. – ctb
Ключ var self = this; - Это гарантирует, что вы указываете на нужный объект цвета, когда данные вернутся. – gmustudent
Да, но почему он не указывает на правильный объект без этой ссылки? И почему это имеет значение, выполняю ли я операцию присваивания или обновляю ссылку (например, с помощью угловых.copy() или вручную для опций цикла)? – ctb