控制器继承在AngularJS中是一个好习惯吗?
Is controller inheritance a good practice in AngularJS?
我是AngularJS的新手,我不知道是否"控制器继承在AngularJS中是一个很好的实践?"。我的意思是,如果我有两个几乎相同的控制器,比如这里:
someModule.controller('SimilarController1', function($scope) {
$scope.theSameFun1 = function() {
// Some $scope manipulation
};
$scope.theSameFun2 = function() {
// Some $scope manipulation
};
$scope.foo = function() {
// Some $scope manipulation
};
});
someModule.controller('SimilarController2', function($scope) {
$scope.theSameFun1 = function() {
// Some $scope manipulation
};
$scope.theSameFun2 = function() {
// Some $scope manipulation
};
$scope.bar = function() {
// Some $scope manipulation
};
});
那么我可以这样写:
someModule.controller('BaseController', function($scope) {
$scope.theSameFun1 = function() {
// Some $scope manipulation
};
$scope.theSameFun2 = function() {
// Some $scope manipulation
};
});
someModule.controller('SimilarController1', function($scope, $controller) {
$controller('BaseController', {$scope: $scope});
$scope.foo = function() {
// Some $scope manipulation
};
});
someModule.controller('SimilarController2', function($scope, $controller) {
$controller('BaseController', {$scope: $scope});
$scope.bar = function() {
// Some $scope manipulation
};
});
这就是解决这类问题的"Angular方式"吗?
我读到重复的零件应该在服务/工厂。我还读到在service/factory中传递和操纵$scope是不好的做法,所以在这种情况下可能不是个好主意。
这个答案并不是AngularJS特有的,但一般来说,你应该更喜欢组合而不是继承,这样做的原因是,如果你向基类添加了新的功能,那么它就会被所有的派生类型继承。起初,这听起来只是你需要的行为,直到你的一个派生类型需要稍微不同的行为,然后在你的派生类型中,你需要覆盖基本行为来获得你的专门行为。这样做一次是可以的(也许),但与大量的多态类型管理和跟踪什么使用基本行为,什么有专家覆盖,然后确保当基本行为改变时,专家同步改变只是成为一个痛苦。
因此,如果我们更喜欢组合,也就是说,如果我们设计每个类,使其接受预定义的组件,这些组件具有特定功能的一小块,那么我们可以通过改变构建它的组件来改变其中一个实例中的特定行为。总的来说,这更符合最佳实践原则(SOLID)等。
回到AngularJS, Angular通过它的依赖注入方案来鼓励它——创建服务,然后把它们注入到控制器和其他服务中。因此,angular的做法是构建一个服务,它封装了每个控制器共享的功能,然后将该服务注入需要它的每个控制器。您可能会认为,与其使用一个单一的服务来完成控制器可能需要的所有功能,不如构建更小的服务,只提供一组特定的相关功能——这只是遵循了关注点分离原则。这种更细粒度的服务模式意味着每个控制器最终只使用它需要的服务,并且更容易做出重用服务的决定。
继承是一个面向对象的概念,Angular是一个javascript框架,这些是不同的概念,你应该使用OOP来参数化你的代码,你应该使用Angular来防止你自己编写自定义DOM查询,这与MVVW框架相比是多余的。考虑一下Angular 2.0,它使用了带有完整OOP概念的ES6类。所以我对你的问题的回答是,随意使用angular的OOP,学习angular 2.0并尝试在angular 1.0中使用它的概念…
顺便说一句,为了你的利益考虑以下问题:
- 将脚本缓存到本地存储的basket.js概念仍然是一个好主意吗
- 这在JavaScript中是一个好的变量名吗
- 在条形图中呈现数据AngularJS,如何制作一个好的多条形图
- 依赖css的javascript的一个好例子是什么
- I'我在页面加载时将整个$_SESSION变量放入一个json对象中.虽然这对我有效,但这是一个好的做法吗
- 关于如何使用BusterJs资源配置选项的一个好例子
- 寻找一个好的答案字符串圆形物体
- 正在寻找一个好的在线JS obsfucator只用于缩小的目的
- 有没有一个好的框架或方法来重构JavaScript对象
- 对于用NodeJS编写的递归MongoDB归档程序来说,这是一个好的架构吗
- 我们有一个好的javascript调试器吗
- 检测按下了哪个键——这是一个好方法吗
- 有没有一个好的方法来缩短Javascript的承诺
- 从C#Windows Phone应用程序调用Javascript-这是一个好方法吗
- 在javascript中使用php代码是一个好习惯吗?
- 在AngularJS中使用自定义指令和$scope之间的紧密耦合是一个好习惯吗?
- 控制器继承在AngularJS中是一个好习惯吗?
- 如果angular视图直接访问服务,这是一个好习惯吗?
- 根据元素的颜色来验证表单是一个好习惯吗?
- 在React中调用this.props.children上的setState或其他方法是一个好习惯吗?