Javascript 对控制器和重写函数使用angular.extend()

Javascript 对控制器和重写函数使用angular.extend(),javascript,angularjs,inheritance,angular-controller,Javascript,Angularjs,Inheritance,Angular Controller,我正在使用Angular 1.4.8并尝试扩展控制器。原始控制器和扩展控制器都非常相似,但我想在扩展控制器中重写一个函数 angular.module('app').controller('ControllerOne', function() { var vm = this; vm.data = {}; vm.callSayHello = function() { vm.sayHello(); } vm.sayHello = fun

我正在使用Angular 1.4.8并尝试扩展控制器。原始控制器和扩展控制器都非常相似,但我想在扩展控制器中重写一个函数

angular.module('app').controller('ControllerOne', function() {

    var vm = this;

    vm.data = {};

    vm.callSayHello = function() {
        vm.sayHello();
    }

    vm.sayHello = function() {
        console.log('Hello from ControllerOne.');
    }
});

angular.module('app').controller('ControllerTwo', ['$scope', function($scope) {

    angular.extend(vm, $controller('OrdersAddController', { $scope: $scope }));

    // I do not want to override vm.callSayHello(), so I don't redeclare that function.

    // This is what I want to override.
    vm.sayHello = function() {
        console.log('Hello from ControllerTwo.');

        // Some other extra handling.
    }
}]);

<button type="button" ng-click="ctrl.callSayHello()">Click Me</button>
angular.module('app')。controller('ControllerOne',function(){
var vm=这个;
vm.data={};
vm.callSayHello=函数(){
vm.sayHello();
}
vm.sayHello=函数(){
log('Hello from ControllerOne');
}
});
角度。模块('app')。控制器('ControllerTwo',['$scope',函数($scope){
extend(vm,$controller('OrdersAddController',{$scope:$scope}));
//我不想重写vm.callSayHello(),因此我不重新声明该函数。
//这就是我想要覆盖的。
vm.sayHello=函数(){
log('Hello from ControllerTwo');
//其他一些额外的处理。
}
}]);
点击我
看起来我可以覆盖
ControllerTwo
中的
ControllerOne
函数。但对于这种特殊情况,我要重写的函数,
vm.sayHello()
,不是直接从单击之类的事件调用,而是由另一个函数,
vm.callSayHello()
调用

因此,当从
ControllerOne
ControllerTwo
调用
vm.callSayHello()
时,也会调用
vm.sayHello()
,但它总是调用
ControllerOne
上的函数,尽管在
ControllerTwo
中重新声明


希望这是有道理的。但是有没有一种方法可以覆盖
ControllerTwo
中的
vm.sayHello()
函数?

您可以这样做:

function mySmth(vm, $scope) {
  // no vm = this
 vm.smth = ...
}
现在:


但这并不是什么花哨的建议,实际上很好的建议是——不要扩展控制器。。。如果您有通用功能,请将其投入使用或单独的控制器。

您可以这样做:

function mySmth(vm, $scope) {
  // no vm = this
 vm.smth = ...
}
现在:


但这并不是什么花哨的建议,实际上很好的建议是——不要扩展控制器。。。如果您有公共函数,请将它们投入服务或单独的控制器。

您可以使用javascript继承实现我们的方法

//控制器1
功能控制器(){
this.data={};
}
ControllerOne.prototype.callSayHello=函数(){
这个;
};
ControllerOne.prototype.sayHello=函数(){
log('Hello from ControllerOne');
};
控制器.$inject=[];
//控制器2
函数控制器两($scope){
}
ControllerTwo.prototype=Object.create(ControllerOne.prototype);
ControllerTwo.constructor=ControllerTwo;
ControllerTwo.prototype.sayHello=函数(){
log('Hello from ControllerTwo');
};
ControllerTwo.$inject=['$scope'];
//角度控制器
角度.module('app',[])
.控制器(“控制器”,控制器)
.控制器(“控制器两个”,控制器两个)

单击我(Ctrl 1)
单击我(Ctrl 2)

您可以将javascript继承用于您的方法

//控制器1
功能控制器(){
this.data={};
}
ControllerOne.prototype.callSayHello=函数(){
这个;
};
ControllerOne.prototype.sayHello=函数(){
log('Hello from ControllerOne');
};
控制器.$inject=[];
//控制器2
函数控制器两($scope){
}
ControllerTwo.prototype=Object.create(ControllerOne.prototype);
ControllerTwo.constructor=ControllerTwo;
ControllerTwo.prototype.sayHello=函数(){
log('Hello from ControllerTwo');
};
ControllerTwo.$inject=['$scope'];
//角度控制器
角度.module('app',[])
.控制器(“控制器”,控制器)
.控制器(“控制器两个”,控制器两个)

单击我(Ctrl 1)
单击我(Ctrl 2)

谢谢您的回答。我读到人们通常不建议扩展控制器,但它们的功能非常接近,我希望有一种可以接受的方法。谢谢你的回答。我曾读到人们通常不建议扩展控制器,但它们的功能非常接近,我希望有一种可以接受的方法。很好的方法。我希望在这里看到这个答案,很好。我希望在这里看到这个答案。