AngularJS:使用调用(或应用)的控制器继承
这是我在尝试使控制器更具可重用性时发现的AngularJS:使用调用(或应用)的控制器继承,angularjs,angularjs-controller,angularjs-factory,Angularjs,Angularjs Controller,Angularjs Factory,这是我在尝试使控制器更具可重用性时发现的 app.factory('BaseController', function(myService) { return function(variable) { this.variable = variable; this.method = function() { myService.doSomething(variable); }; }; }) .controller("ChildController1",
app.factory('BaseController', function(myService) {
return function(variable) {
this.variable = variable;
this.method = function() {
myService.doSomething(variable);
};
};
})
.controller("ChildController1", function($scope, BaseController) {
BaseController.call($scope, "variable1");
})
.controller("ChildController2", function($scope, BaseController) {
BaseController.call($scope, "variable2");
});
现在我可以在我的HTML中做类似的事情(例如在ng controller=“ChildController1”):ng click=“method()”
代码简单有效。但我不知道它到底是如何工作的(它是什么样的模式?),这样做是一种好的做法吗?您的解决方案或多或少是这样工作的:
app.factory('mixinBaseController', function(myService) {
return function (scope, variable) {
angular.extend(scope, {
variable: variable;
method: function() {
myService.doSomething(variable);
}
});
};
})
.controller("ChildController1", function($scope, mixinBaseController) {
mixinBaseController($scope, "variable1");
})
.controller("ChildController2", function($scope, mixinBaseController) {
mixinBaseController($scope, "variable2");
});
你能看见吗?通过您的.call($scope,…)
只是将上下文(this
)设置为真实的$scope
,这样BaseController
就可以通过属性和函数扩展您的范围
这只是为了演示您的代码是如何工作的
要实现更类似JavaScript的继承,请参见:
controllerAs
。这也有助于实现控制器的继承