Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS中带有成员变量的子类工厂_Javascript_Angularjs_Oop - Fatal编程技术网

Javascript AngularJS中带有成员变量的子类工厂

Javascript AngularJS中带有成员变量的子类工厂,javascript,angularjs,oop,Javascript,Angularjs,Oop,我有几十家AngularJS工厂,它们有很多共同点。所以我试图创建一个基类并将其子类化 但是我注意到子类共享基类的成员变量 我在上做了一个示例,代码也发布在这里: HTML: 我的预期产出是: ChildService: 1 AnotherChildService : 2 但我得到的却是: ChildService: 2 AnotherChildService : 2 我认为ChildService和另一个ChildService共享相同的privateVar,因此我得到了相同的值 我应

我有几十家AngularJS工厂,它们有很多共同点。所以我试图创建一个基类并将其子类化

但是我注意到子类共享基类的成员变量

我在上做了一个示例,代码也发布在这里:

HTML:

我的预期产出是:

ChildService: 1

AnotherChildService : 2
但我得到的却是:

ChildService: 2

AnotherChildService : 2
我认为
ChildService
另一个ChildService
共享相同的
privateVar
,因此我得到了相同的值

我应该如何更改代码以使他们使用不同的
privateVar


谢谢

我用的是这样的东西:

angular.module('app')
.controller('ParentController', ['$scope', 'dataService', function ($scope, dataService) {
   //controller logic here
}])
.controller('ChildController', ['$scope', '$controller', 'SomeDataService', function ($scope, $controller, SomeDataService) {
//extend your parentcontroller
    $scope.init = function () {
        //do something
    }
    angular.extend(this, $controller('ParentController', {
        $scope: $scope,
        dataService: SomeDataService
    }));
}])
.factory('BaseDataService', ['logger', function (logger) {
  var privateArray = [];

  return {
   publicFunction: function(){ return privateArray; },
   publicVar: "some var"
  }
}])
.factory('SomeDataService', ['BaseDataService', function (dataService) {
    var service = angular.extend({}, dataService);
    service.privateFunction = function () {
        //some code
    }
    service.privateVar= "some value";
    return service;
}]);
在这个例子中,我将所有这些结合在一起

希望这有帮助


编辑:这使用了本

中描述的mixin模式。我也有同样的问题,当一个声明my BaseService时,问题得到了解决:

demo = angular.module('demo', []);

demo.factory('BaseService', function(){
  return {
    privateVar: 0,

    setPrivateVar: function (value) {
      this.privateVar = value;
    },

    getPrivateVar: function () {
        return this.privateVar;
    }
  }
});

我的“儿童”服务和你的一样。一切都很好。

所以关键是使用
角度。扩展
?我试过了,但都不起作用,请看:我也试过角度。复制也不起作用。我试过一些东西。当你直接访问变量时,它是有效的。我认为函数的使用对我的项目来说是非常必要的,否则我将不得不进行大量的复制/粘贴,失去面向对象编程的好处。我不得不同意,这种行为有点奇怪。。。在基本上下文中调用定义的函数。以及子上下文中的变量。那真的没有用。。。我在很多服务上使用这种抽象机制,但从未使用过作为私有变量设置器的函数。大多数时候我重写函数和/或变量。这确实有效。但是你或者其他人能解释一下为什么这样做吗?它似乎在做同样的事情,但显然内部工作方式有点不同。我还注意到,直接设置
privateVar
就像
ChildService.privateVar=5
一样也可以,只要您也像
ChildService.privateVar
一样访问。也就是说,如果不使用getter和setter,代码可以正常工作。
angular.module('app')
.controller('ParentController', ['$scope', 'dataService', function ($scope, dataService) {
   //controller logic here
}])
.controller('ChildController', ['$scope', '$controller', 'SomeDataService', function ($scope, $controller, SomeDataService) {
//extend your parentcontroller
    $scope.init = function () {
        //do something
    }
    angular.extend(this, $controller('ParentController', {
        $scope: $scope,
        dataService: SomeDataService
    }));
}])
.factory('BaseDataService', ['logger', function (logger) {
  var privateArray = [];

  return {
   publicFunction: function(){ return privateArray; },
   publicVar: "some var"
  }
}])
.factory('SomeDataService', ['BaseDataService', function (dataService) {
    var service = angular.extend({}, dataService);
    service.privateFunction = function () {
        //some code
    }
    service.privateVar= "some value";
    return service;
}]);
demo = angular.module('demo', []);

demo.factory('BaseService', function(){
  return {
    privateVar: 0,

    setPrivateVar: function (value) {
      this.privateVar = value;
    },

    getPrivateVar: function () {
        return this.privateVar;
    }
  }
});