【发布时间】:2016-05-04 02:14:17
【问题描述】:
我很难理解用我的控制器实现继承的最佳方式。我在这里看到了一些关于这些的其他帖子,但我仍然没有得到一些东西。
这是我所拥有的:
- 2 个 80% 相似的控制器。我已经有一个工厂,两者都用来获取将要显示的数据。
- 我使用控制器作为符号,带有var vm = this
- 将在视图中使用的变量和函数混合在一起,因此在 vm 内部创建,而其他一些内部变量和函数则不是。
- 所以我尝试用所有这些创建一个单一的父控制器,然后使用注入来创建这两个控制器,只覆盖我需要的,但这并不像我预期的那样工作,而且我不确定这是正确的做
这是代码的简化版本。
(function() {
angular
.controller('ParentController', ParentController)
ParentController.$inject = [ '$scope', '$location' ];
function ParentController($scope, $location) {
var vm = this; // view model
var URL = $location.url();
var isDataLoaded = false;
vm.predicate = 'order';
vm.reverse = false;
vm.results;
vm.isDataReady = isDataReady;
vm.setOrder = setOrder;
function isDataReady() {
return isDataLoaded;
}
function setOrder(p) {
vm.reverse = (p === vm.predicate) ? !vm.reverse : false;
vm.predicate = p;
}
$scope.$on('READ.FINISHED', function() {
isDataLoaded = true;
})
}
})();
-
(function() {
angular
.controller('ChildController', ChildController)
ChildController.$inject = ['$controller', '$scope', 'myFactory'];
function ChildController($controller, $scope, myFactory) {
$controller('ParentController', {$scope: $scope});
var TEMPLATE = 'SCREEN';
// ************** M A I N **************
myFactory.getResults(URL, vm);
}
})();
现在按我的预期工作。
当我用 ParentController 注入 ChildController 时,我真的需要注入 $scope 吗?我实际上正在使用vm。另外,我还需要注入 $location 吗?在这个例子中,当我执行我的代码时,我不得不在 ChildController 中再次使用 var URL = $location.url();,我希望从 ParentController 继承值。
所以问题是,如果我这样工作,我是否只能从 $scope 获取值? vm呢?那么像var isDataLoaded这样在vm之外声明的变量/函数呢?
我很感激对此的一些见解。这是正确的方法吗?
非常感谢。
编辑:好的,我发现了如何使用我的 ControllerAs 语法。子控制器中的代码如下:
function ChildController($controller, $scope, myFactory) {
$controller('ParentController as vm', {$scope: $scope});
var vm = $scope.vm;
var TEMPLATE = 'SCREEN';
// ************** M A I N **************
myFactory.getResults(URL, vm);
}
但我仍然需要找到一种方法来恢复父控制器中的常规 var/functions。有任何想法吗?能干干净净吗?
【问题讨论】:
标签: angularjs controller