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