为什么这个带有变量对象名的AngularJs服务返回一个未定义的对象?

时间:2015-09-17 09:35:02

标签: angularjs object angularjs-directive angularjs-service angularjs-controller

方案

我想使用此服务在webApp中共享一些属性。 这个服务应该有一些对象,控制器应该能够获取和设置这些对象。

JS

var oneApp = angular.module('myApp', ['ui.bootstrap', 'ngTouch', 'ngAnimate'])
  .service('sharedProps', function() {
    var anObjNameDest = '';
    var anObjPropName = '';

    this.progressBarDynTyped00 = {
      dynamic: 0,
      dynMultiplier: 10,
      max: 100
    };

    var progressBarDynTyped00 = {
      dynamic: 1000,
      dynMultiplier: 10010,
      max: 100100
    };


    var test = this.progressBarDynTyped00;

    var test2 = progressBarDynTyped00;

    return {
      getDynObject: function(anObjNameDest) {
        return this[anObjNameDest];
      },
      getDynObjectVal: function(anObjNameDest, anObjPropName) {
        return this[anObjNameDest][anObjPropName];
      },
      setDynObjectVal: function(anObjNameDest, anObjPropName, value) {
        this[anObjNameDest][anObjPropName] = value;
      },
      setDynObject: function(anObjNameDest, ObjSrc) {
        this[anObjNameDest] = ObjSrc;
      }
    }
  });


oneApp.directive("progressBarDynTyped", function() {
    return {
      restrict: "E",
      templateUrl: "aTemplateUrl.html",
      controller: function(sharedProps) {

        this.test = sharedProps.getDynObject('progressBarDynTyped00');

        this.dynMultiplier 
                = sharedProps.getDynObjectVal('progressBarDynTyped00', 'dynMultiplier');
      },
      controllerAs: "progressBarDynTyped00"
    };

  });

问题

在上面的代码中我有一个服务,其中有两个测试对象(以前只有一个测试对象,第二个是为了测试目的而添加),那些测试对象应该从这个服务返回到一些contrellers函数,就像在“progressBarDynTyped00”控制器中一样,因为我需要在这些对象中获取并设置一些值。

从服务中调用所有已重新调整的函数,总是给我一个未定义的对象或“未读取属性'dynMultiplier'的未定义”。

问题

有没有办法返回将对象名称传递给服务函数的动态对象?

感谢所有人。

2 个答案:

答案 0 :(得分:2)

我认为您在Angular中创建服务的两种方式之间感到困惑:使用service keyword和factory keyword

对于service关键字,应该通过将公共函数分配给它来使其可用:

angular.module('myApp', ['ui.bootstrap', 'ngTouch', 'ngAnimate']).service('sharedProps', function () {

    this.getDynObject = function (anObjNameDest) {
       //...
    };

}]);

并不期望有回报价值。因此,使用上面的代码,没有要调用的公共函数,这解释了错误

答案 1 :(得分:1)

角度服务是角度工厂的简化版本。所以你应该使用工厂而不是服务

myApp.service('myservice', function() {
   this.method = function() {
      return "result";
   };
});

myApp.factory('myfactory', function() {
   return {
      method : function() {
                  return "result";
               };
   }
});