2016-09-23 1 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;}); 

Так что, когда я отладки, если я поставил точку останова в контроллере, где присваивание 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]; 
} 

Казалось бы, что назначение объекта является проблема, в то время как его изменение в порядке? Почему это?

ответ

1

Это может работать для ya. Думаю, это может быть проблема с указателем?

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

Да, но почему он не указывает на правильный объект без этой ссылки? И почему это имеет значение, выполняю ли я операцию присваивания или обновляю ссылку (например, с помощью угловых.copy() или вручную для опций цикла)? – ctb

0

В то время вы звоните return в вашем заводе, someSvc.colors это просто пустой массив - и возвращается значение. Поскольку Угловые провайдеры вообще пытаются запускать только один раз, в будущем он фактически не проверяет someSvc.colors снова - просто возвращает начальное значение.

Обертка в функции означает, что она запускает функцию каждый раз, поэтому она извлекает обновленное значение.

+0

Если бы это было так, почему бы другая строка заработала: 'angular.copy (...)' – ctb

 Смежные вопросы

  • Нет связанных вопросов^_^