将angular对象推出范围,或将对象与我的提供者合并

时间:2015-12-14 18:48:50

标签: javascript angularjs

不完全确定如何说出我的问题,但我的关注涉及一个我称之为xyzApi的对象。我在我的角度代码之外定义了这个对象,它包含了一些类和实用方法等,我希望它可以用于我的其余api。

看起来像这样(简短版):

var xyzApi = xyzApi || {
    entities : new function () {
        this.oAuthToken = function (token, expires, type) {
            this.token = token;
            this.expires = expires;
            this.type = type;
            this.toString = function () {
                if (this.token != null)
                    return this.type + ' ' + this.token;
                return null;
            };
        };
    }
};

现在,我的角度服务层创建了一个名为xyzApi的提供程序。它看起来像这样:

(function () {
    angular.module('xyzDataWebServices').provider('xyzApi', function () {
        var baseUrl;
        this.setBaseUrl = function (value) {
            baseUrl = value;
        };
        this.$get = ['$log', 'baseRequest', 'xyzApiContext', 'xyzApiAuthentication', 'xyzApiLibrary', function xyzApiFactory($log, baseRequest, xyzApiContext, xyzApiAuthenication, xyzApiLibrary) {
            baseRequest.setServiceUrl(baseUrl);
            var factory = {
                context: xyzApiContext,
                authentication: xyzApiAuthenication,
                library: xyzApiLibrary
            }
            return factory;
        }];
    });
})();

现在,当代码使用提供程序时,我希望将原始对象合并到提供程序中,就好像它是它的一部分一样。

这会自动发生,还是会在使用提供程序的控制器范围内导致原始对象不可见?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以将preferences.getInt(myKey, myDefaultValue)factory合并到您的提供商内。

我认为这不会自动发生。但是,如果您在提供商中添加xyzApi,它应该像您想要的那样工作。

angular.merge(factory, xyzApi);正在使用Angular 1.4或更高版本。 angular.merge()可能也会起作用,但深度合并则不会发生。

请查看下面的演示或此jsfiddle

它只显示这两个对象的合并。

angular.extend()
var xyzApi = xyzApi || {
	sayHello: function() {
  	return "hey there\n";
  }
};

angular.module('demoApp', [])
	.controller('MainController', MainController)
  .provider('xyzApi', function XyzApiProvider() {
  
  this.$get = function() {
  
  	var xyzApiFactory = {
      otherFunction: function() {
        //$log.log('other function called');
        return 'other function \n';
      }
  	};
    //console.log(xyzApiFactory, xyzApi);
    angular.merge(xyzApiFactory, xyzApi);
    return xyzApiFactory;
  };
});


function MainController(xyzApi) {
	var vm = this;
  vm.test = '';
  
	vm.sayHello = function() {
  	vm.test += xyzApi.sayHello() + xyzApi.otherFunction();
  }
}