1

Я пытаюсь изменить переменную папок (массив) внутри оператора return моей угловой фабрики, но она, похоже, работает только для созданного действия, которое я написал. Я думаю, что не понимаю, как переменная область работает на заводе.переменная область в угловой фабрике

это работает:

folders.push(response.folder) 

, но ... когда я использую функцию underscore.js _without (который возвращает массив), он не изменяет переменную папки.

folders = _.without(folders, _.findWhere(folders, {id: folder.id })) 

Вот мой завод код:

angular.module('cmsApp') 
    .factory('Folders', function(Restangular){ 

    var folders = Restangular.all('folders').getList().$object; 

    return { 
     get: function(){ 
      return folders; 
     }, 
     create: function(folderName) { 
      folder = { label: folderName }; 
      folders.post(folder).then(function(response) { 
      folders.push(response.folder); 
      }) 
      return folders; 
     }, 
     destroy: function(folder) { 
      folders.remove(folder).then(function(){ 
      folders = _.without(folders, _.findWhere(folders, {id: folder.id })) 
      }) 
      return folders; 
     } 
    } 
}); 

создать функция возвращает обновленную папку вар но уничтожить функция возвращает не-измененные папки вара.

ответ

1

_.without возвращает новый массив, см. docs, поэтому вы эффективно меняете место, на которое указывает folders. Однако, поскольку вы вызываете _.without только после того, как обещание разрешится, то есть внутри then, это изменение произойдет только после того, как вы вернете исходный объект folders, чтобы в итоге вы получили две ссылки, указывающие на разные массивы.

Это, вероятно, лучшая практика, чтобы вернуть реальное обещание из вашей фабрики, таким образом, вы можете ссылаться на правильные данные после возвращения обещаний.

+0

Убрал указатель и изменил «folders =» на метод сплайсинга, чтобы изменить фактический массив. Благодарю. – armynante

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