0

В моем приложении с угловыми углами у меня есть служба, в которой хранится структура конфигурации, которая используется различными компонентами моего приложения. В .run-фаза, что guiConfigService считывает конфигурацию из файла в .json с помощью функции setGuiConfig и могут возвращать данные для определенного компонента с помощью функции getGuiConfig:Услуги AngularJs с изолированным областью

myApp.factory("guiConfigService", ['$http', function($http) { 
    var guiConfig = {}; 
    var self = { 
     setGuiConfig: function (callback) { 
      guiConfig = {"Functions" : { 
      "FunctionIds" : [ 
       "3", 
       "5", 
       "10", 
       "last_entry" 
      ] 
      }}; 
      if (undefined !== callback) { 
      callback(guiConfig); 
      } 
     }, 
     getGuiConfig: function (buzzword, callback) { 
      callback(guiConfig[buzzword]); 
     } 
    } 
    return self; 
}]); 

Моей проблема:

В контроллер моего компонента я хочу иметь возможность манипулировать тем, что я вернусь от функции getGuiConfig моей службы, скажем, я хочу удалить последнюю запись атрибута FunctionIds. Эта манипуляция влияет не только на объект в моем котроллере, но также и на работу с объектом guiConfig -Object в моей службе.

function MyCtrl($scope, guiConfigService) { 

    var configData; 

    $scope.getNewGuiConfig = function() { 
    guiConfigService.getGuiConfig('Functions', function(data) { 
     configData = data; 
     // this does not only affect `configData`, but also the 
     // `guiConfig`-Object in guiConfigService: 
     configData.FunctionIds.splice(-1); 
    }); 
    } 
} 

См. Например this JsFiddle.

То, что я уже пробовал:

  • Сначала я думал, проблема мне вызов обратного вызова функции и не возвращает объект непосредственно, но я попробовал, и это, кажется, не работает.
  • Отправка копии моего Сервиса guiConfig Объект JSON.parse(JSON.stringify(guiConfig[buzzword])) работает, но мне не кажется правильным способом.

Есть ли хороший способ вернуть данные с объекта в эксплуатацию без ссылки на фактический объект?

+2

Вы можете использовать angular.copy() в функции обратного вызова. – Dev

+1

Обычный код для конфигураций в контроллере: ~ config = angular.extend (ctrl.config || {}, service.getNewGuiConfig()); –

ответ

1

Все услуги Singleton в угловом режиме. Таким образом, вы можете сделать копию данных конфигурации в своем контроллере и соответствующим образом изменить ее. Согласно мне, вы должны использовать постоянную службу для хранения конфигураций приложений и всегда составлять копию своих конфигураций, когда хотите манипулировать ими с помощью метода angle.copy().

function MyCtrl($scope, guiConfigService) { 
    var configData; 
    $scope.getNewGuiConfig = function() { 
     guiConfigService.getGuiConfig('Functions', function(data) { 
     configData = angular.copy(data); 
     configData.FunctionIds.splice(-1); 
    }); 
} 
} 
+0

Поскольку служба используется в нескольких компонентах, я бы сказал, что имеет смысл сделать копию этой копии, чем контроллер. В противном случае, спасибо! – LocalHorst