具有隔离作用域的AngularJs服务

具有隔离作用域的AngularJs服务,angularjs,data-binding,angular-services,isolate-scope,one-time-binding,Angularjs,Data Binding,Angular Services,Isolate Scope,One Time Binding,在我的Angular应用程序中,我有一个存储配置结构的服务,它由我的应用程序的各个组件使用。在.run-阶段,guiConfigService通过函数setGuiConfig读取.json文件中的配置,并能够通过函数getGuiConfig返回特定组件的数据: myApp.factory("guiConfigService", ['$http', function($http) { var guiConfig = {}; var self = { setGuiConf

在我的Angular应用程序中,我有一个存储配置结构的服务,它由我的应用程序的各个组件使用。在
.run
-阶段,
guiConfigService
通过函数
setGuiConfig
读取
.json
文件中的配置,并能够通过函数
getGuiConfig
返回特定组件的数据:

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
的最后一个条目。此操作不仅影响我的cotroller中的对象,还操作我的服务中的
guiConfig
-对象

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);
    });
  }
}
例如,见

我已经尝试过的:

  • 首先我想,问题是我调用了一个回调函数而没有直接返回对象,但是我尝试了,它似乎也不起作用
  • 通过
    JSON.parse(JSON.stringify(guiConfig[buzzword])
    发送我的服务的
    guiConfig
    对象的副本是可行的,但在我看来这不是正确的方法
有没有一种好方法可以从服务中的对象返回数据,而不引用实际对象

所有服务在angular中都是单例的。因此,您可以在控制器中复制配置数据并相应地修改它。 根据我的说法,你应该使用constant service来存储你的应用程序配置,并且当你想使用angular.copy()操作配置时,总是要复制配置


您可以在回调函数中使用angular.copy()。控制器中配置的常用代码是~:config=angular.extend(ctrl.config | |{},service.getNewGuiConfig());由于服务在多个组件中使用,我认为让服务制作副本比让控制器制作副本更有意义。否则,谢谢!
function MyCtrl($scope, guiConfigService) {
   var configData;
   $scope.getNewGuiConfig = function() {
      guiConfigService.getGuiConfig('Functions', function(data) {
       configData = angular.copy(data);
       configData.FunctionIds.splice(-1);
   });
 }
}