私は角度1.4.8を使用しており、コントローラを拡張しようとしています。元のコントローラーと拡張コントローラーは非常に似ていますが、拡張コントローラーでオーバーライドしたい機能があります。コントローラとオーバーライド関数のためのangular.extend()の使用
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>
私はControllerTwo
でControllerOne
機能を無効にすることができますように見えます。しかし、この特定のケースでは、オーバーライドする関数vm.sayHello()
は、クリックのようなイベントから直接呼び出されるのではなく、別の関数であるvm.callSayHello()
によって呼び出されます。
は、だから何が起こるかであることvm.callSayHello()
もvm.sayHello()
を呼び出しますが、それは常にControllerTwo
で再宣言されているにもかかわらずControllerOne
上の関数を呼び出すControllerOne
かControllerTwo
、のいずれかから呼び出されたとき。
うまくいけばうまくいきます。しかし、ControllerTwo
のvm.sayHello()
関数をオーバーライドする方法はありますか?今
function mySmth(vm, $scope) {
// no vm = this
vm.smth = ...
}
:
感謝をjavascriptの継承を使用することができます。私は人々が一般的にコントローラを拡張することをお勧めしていないことを読んだが、それは私が受け入れられる方法があることを望んでいた機能に非常に近いものだった。 – kenshin9