2015-05-15 3 views
3

Когда я расширяю контроллер по угловому, есть ли способ вызвать функцию на контроллере «суперкласса» из функции «подкласс», которая ее переопределяет?Наследование углового контроллера/переопределение методов «суперкласса»

Для ясности - в Java я хотел бы сделать:

class Foo { 
    void doStuff(){ 
     //do stuff 
    } 
} 

class FooBar extends Foo { 
    void doStuff(){ 
     super.doStuff(); 
     //do more stuff 
    } 
} 

, и я хотел бы сделать эквивалент в угловой - то

myApp.controller('FooCtrl', function($scope){ 

    $scope.doStuff = function(){ 
     //do stuff 
    } 
}).controller('FooBarCtrl', function($scope){ 
    angular.extend(this, $controller('FooCtrl', {$scope: $scope})); 

    $scope.doStuff = function(){ 
      // ??? <- INSERT ANSWER HERE 
     //do more stuff 
    } 
} 
+1

Короткий ответ: да (см .: http://stackoverflow.com/a/19670187/624590). Длинный ответ (/ мнение): рассмотрите миксины или фабрики как средства СУШЕНИЯ вашего кода вместо продолжения/наследования. – DRobinson

+0

Но для того, чтобы ваша попытка работала, запустите старую функцию где-то перед ее переопределением: 'var superDoStuff = $ scope.doStuff; $ scope.doStuff = function() {superDoStuff();/* делать больше вещей * /}; ' – DRobinson

ответ

1

Я бы не хотел, т рекомендовать эту модель, но в качестве ответа на вопрос, вот способ сделать это:

myApp.controller('FooCtrl', function($scope){ 

    $scope.doStuff = function(){ 
     //do stuff 
    } 
}).controller('FooBarCtrl', function($scope){ 
    angular.extend(this, $controller('FooCtrl', {$scope: $scope})); 
    //extend the scope 
    var super = angular.extend({}, $scope); 
    $scope.doStuff = function(){ 
      // ??? <- INSERT ANSWER HERE 
     //do more stuff 
     //call the "superclass" methods 
     if(super.doStuff){ 
      super.doStuff(); 
     } 
    } 
} 

Spitballing, я полагаю, не могли бы вы написать вспомогательную службу, которая позволила переопределить свойства со ссылками на суперкласса чтобы сделать его более чистым. Возможно, переопределив «это». Что-то вроде:

$scope.doStuff = $override($scope.doStuff, function() { 

    this(); //calls the original doStuff function 
}); 

.factory('$override', function(){ 

    return function(method, func){ 
     return function(){ 
      return func.apply(method, arguments); 
     }; 
    }; 
}); 
0

Вы можете использовать $ родителю

так

$scope.$parent.doStuff() 
+3

Различные виды наследования. Вопрос заключается в попытке создать контроллер, который обладает всеми свойствами другого контроллера, но может переопределить их своим собственным (класс суперкласса/подкласса), а не контроллером, который вложен в другой (как подсказывает ваш ответ). http://en.wikipedia.org/wiki/Inheritance_%28object-oriented_programming%29 – DRobinson

+0

@DRobinson - точно. – drewmoore

Смежные вопросы