2016-06-08 3 views
0

У меня есть простой контроллер, и я хотел бы представить очень похожий дополнительный контроллер, но не копируя слишком много кода.Как наследовать и переопределять методы контроллера в angularjs (java pendent)?

angular.module('test').controller('parentController', parentController); 
parentController.$inject = ['$scope', '$location', 'someService']; 

function myController($scope, $location, someService) { 
    var params = getQueryString(); 
    var rsp = executeQuery(params); 

    processResponse(rsp); 

    function getQueryString() { 
     return "?param=1&someparam=2"; 
    } 

    function executeQuery(params) { 
     ... 
    } 

    function processResponse(rsp) { 
      //process rsp, convert some parts, and populate model properties, like 
      $scope.model.prop1 = rsp.data.prop1; 
    } 
}; 

Теперь я хотел бы создать контроллер, который 90% равен коду parentController. Основные отличия:

  • получить getQueryString() должны возвращать другой запрос
  • ответ свойства сеттеров на $scope должен содержать-Измененную строку
  • , необходима дополнительная filter функции для внутри нового контроллера, который должен существовать только для него, но не для parentController.

Исходя из java, я бы решить эту проблему, например, с наследованием и перекрытыми методами, как:

public cass ParentClass { 
    String getQueryString() { 
     return "?param=1&someparam=2"; 
    } 
} 

public class CustomClass extends ParentClass { 
    @Override 
    String getQueryString() { 
     return "?customparam=1"; 
    } 

    @Override 
    void processResponse(rsp) { 
     super.processResponse(rsp); 
     //read "rsp.paramX" additionally 
    } 
} 

Но как я могу достичь подобный с angularjs?

ответ

1

Давайте предположим, что у вас есть эта структура:

<div ng-controller="parentCtrl"> 
    ... 
    <div ng-controller="childCtrl"></div> 
</div> 

Поскольку контроллер ребенок находится под сферу родительского контроллера, он может получить доступ все методы/varialbe контроллера родителя, до тех пор, как они определены на $scope родительского контроллера (т.е. $scope.someVar).

UPDATE

Если 2 контроллера не имеют отношения родитель/ребенок, вы должны будете использовать service, где вы поставите общую логику, а затем вы можете определить функцию инициализации на службе, которая запускает последовательность.

Так вы будете контроллерами все что вам нужно сделать, это позвонить myService.init() (и, возможно, передать некоторые параметры)

+0

Я не имеющий вложенную структуру родитель-ребенок. Контроллеры должны принадлежать к различным представлениям, все еще очень похожи по своей логике. Когда выполняется 'myController', он действует как некоторый тип класса шаблонов и выполняет эти функции в порядке:' getQueryString, executeQuery, processResponse'. Я хотел бы запретить повторять эти вызовы функций в дочернем элементе, так как их процесс уже определен в родительском классе. – membersound

+0

Я имею в виду, что мне нужно было бы явным образом вызвать эти методы из дочернего элемента, хотя их порядок выполнения уже определен в родительском классе. – membersound

+0

Итак, единственный выбор здесь - определить службу, которая содержит логику, и затем вы определяете функции на обоих контроллерах и используете службу: https: //docs.angularjs.org/guide/services – Tomer

0

можно использовать $injector принести в свойствах контроллера родительских к контроллеру ребенка .. контроллер ребенка будет что-то вроде этого:

function childController($injector, $scope, someService) { 
    // override the method 
    this.getQueryString() { 
     // new query will be returned 
    } 

    $injector.invoke(myController, this, { 
      $scope: $scope, 
      someService: someService 
    }); 
}; 

Вы можете найти подробности этого подхода здесь: https://www.exratione.com/2013/10/two-approaches-to-angularjs-controller-inheritance/

+0

Означает ли этот подход, что любая служба, которая должна быть введена в 'parentController', также должна быть введена в' childController', а затем назначена внутри 'invoke()'? – membersound

+1

Да, вы правы .. служба должна быть введена в 'childController', а затем назначена внутри метода' invoke' –

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