我使用角度来构建一个大应用程序,我有一些常用的控制器方法实际上我这样做,但有一个最好的方法吗?
app.controller('baseController', function($scope, $controller, appFactory) {
var $scope.foo = function() {
// Do something
}
});
app.controller('childController', function($scope, $controller, appFactory) {
// Here i extend or something like, the base controller
$controller('baseController', {$scope: $scope});
var $scope.bar = function() {
// Do a lot of things an then call foo
$scope.foo();
}
}):
我这样做是因为这种方法需要具有我控制器的de $范围。
答案 0 :(得分:3)
我不同意上述注释,不应该为控制器实现继承。在许多情况下,即使您使用共享服务/工厂/提供商,控制器继承也会使您的代码保持DRY。使用@ Clever的答案示例,如果您可以将其放入单个基本控制器中,为什么要在X个控制器中重复$scope.foo = function() { MyFactory.calculateFoo(); }
。这并没有使控制器变胖,而是将其清理干净并保持干燥。
Misko自己在AngularJS google小组中给出了example一个可能的控制器继承实现。我个人自己使用这个方法,简单的例子,从我的孩子控制器中调用:
$injector.invoke(MyBaseController, this, { $scope: $scope, alertService: alertService });
我使用控制器继承的一个示例,对于我的大多数CRUD页面,我有一个实现通用create / update $ scope函数的父控制器。此基本控制器获取注入的存储库服务,用于执行实际的服务器调用等。为什么要反复对所有CRUD页面重复此操作?
答案 1 :(得分:1)
详细说明KayakDave所说的,Angular控制器通常是轻量级的。如果您发现自己在控制器中思考“继承”,那么您可能做错了。最好将控制器之间共享的公共逻辑提取到Service/Factory/Provider。例如:
app.Factory('MyFactory', function() {
return {
calculateFoo: function() {
// stuff
}
};
});
app.controller('FirstCtrl', function($scope, $controller, MyFactory) {
var $scope.foo = function() {
MyFactory.calculateFoo();
}
});
app.controller('SecondCtrl', function($scope, $controller, MyFactory) {
var $scope.bar = function() {
MyFactory.calculateFoo();
}
}):