当我们在IIFE中包围控制器对象时,我真的不明白如何以角度(不使用$ scope)继承控制器对象。
假设我们有2个控制器文件:
Animal.js
(function() {
'use strict';
angular.module('myApp').controller('animalCtrl', function() {
this.strength = 3;
this.speed = 3;
});
})();
Beaver.js
(function() {
'use strict';
angular.module('myApp').controller('beaverCtrl', function() {
//How do I inherit the parent controllers stats?
});
})();
如何使用myaverCtrl继承animalCtrl?
答案 0 :(得分:2)
在任何angularjs站点上共享数据的最佳方式是使用服务。在这种情况下,我会创建一个存储强度和速度的工厂,并与beaverCtrl共享它。
angular.module('<yourappname>', [])
.factory('dataService', function() {
$scope = this;
$scope.strength = null;
$scope.speed = null;
$scope.setStrength = function(value) {
$scope.strength = value;
}
$scope.setSpeed = function(value) {
$scope.speed = value;
}
return $scope;
})
然后在控制器中你可以像这样调用服务
.controller('animalCtrl', function(dataService) {
this.strength = 3;
this.speed = 3;
dataService.setStrength(this.strength);
dataService.setSpeed(this.speed);
});
.controller('beaverCtrl', function(dataService) {
this.strength = dataService.strength;
this.speed = dataService.speed;
});
答案 1 :(得分:2)
重要的是要意识到AngularJS控制器只是一个普通的javascript“类”。唯一的问题是使用依赖注入调用基础构造函数。
// Create some base class.
BaseController = function($scope, $route) {
// Do some stuff here.
};
// The base class has some behavior.
BaseController.prototype.someMethod = function() { /* do something */ };
// Create some child class.
ChildController = function($scope, $injector) {
// Invoke the base constructor.
$injector.invoke(this, BaseController, {$scope: $scope});
};
// Inherit from the base class.
ChildController.prototype = Object.create(BaseController.prototype);
// Add more specific behavior.
ChildController.prototype.someChildMethod = function() { /* do something */ };
然后您可以将控制器注册为
angular.module('myApp').controller('ChildController', ChildController);
请记住,如果过度使用,使用这样的继承会有问题。它只应用于共享行为。另外,使用不同“类”的组合通常比使用继承更灵活。
从代码组织的角度来看,我还建议您在一个地方声明您的控制器(每个控制器一个文件)并将它们注册到另一个地方的模块(每个模块一个文件)。