W ramach modułu kontroler może dziedziczyć właściwości z zewnętrznego kontrolera:
var app = angular.module('angularjs-starter', []);
var ParentCtrl = function ($scope, $location) {
};
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope});
});
Przykład: Dead link : http://blog.omkarpatil.com/2013/02/controller-inheritance-in-angularjs.html
Czy kontroler wewnątrz modułu może dziedziczyć od rodzeństwa?
var app = angular.module('angularjs-starter', []);
app.controller('ParentCtrl ', function($scope) {
//I'm the sibling, but want to act as parent
});
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope}); //This does not work
});
Drugi kod nie działa, ponieważ $injector.invoke
wymaga funkcji jako pierwszego parametru i nie znajduje odniesienia do ParentCtrl
.
angularjs
inheritance
angularjs-controller
Federico Elles
źródło
źródło
Odpowiedzi:
Tak, może, ale
$controller
zamiast tego musisz użyć usługi, aby utworzyć instancję kontrolera: -źródło
ParentCtrl
powinno być acontroller
czy jest możliwe użycieservice
?$controller
mogą używać tylko zarejestrowanych kontrolerów.$scope
sięthis
(w teorii)Jeśli używasz
vm
składni kontrolera , oto moje rozwiązanie:Niestety, nie można użyć
$controller.call(vm, 'BaseGenericCtrl'...)
, aby przekazać bieżący kontekst do funkcji zamknięcia (dlareload()
), dlatego tylko jednym rozwiązaniem jest użyciethis
funkcji dziedziczonej w celu dynamicznej zmiany kontekstu.źródło
vm
jest tylko zmienną wewnątrz kontrolera, nie sądzę, żeby Angular mógł użyć go zgodnie z oczekiwaniami.Myślę, że powinieneś skorzystać z fabryki lub usługi, aby zapewnić dostępne funkcje lub dane dla obu kontrolerów.
tutaj jest podobne pytanie ---> Dziedziczenie kontrolera AngularJS
źródło
loading
zmienną, aby podczas ładowania danych zawsze robiłem to samo, nie sądzę, aby fabryki to potrafiły. Mój kontroler nadrzędny może mieć zmienną ładowania, ale fabryka nie może nią manipulować ... prawda ?!W odpowiedzi na problem podniesiony w tej odpowiedzi przez gmontague znalazłem metodę dziedziczenia kontrolera za pomocą $ controller () i nadal używam kontrolera jako składni.
Po pierwsze, używaj składni „as”, gdy dziedziczysz wywoływanie $ controller ():
Następnie w szablonie HTML, jeśli właściwość jest zdefiniowana przez element nadrzędny, użyj przycisku,
parent.
aby pobrać właściwości odziedziczone od elementu nadrzędnego; jeśli zdefiniowane przez dziecko, użyj go,child.
aby je odzyskać.źródło
Zrobiłem to w inny sposób. W moim przypadku chciałem funkcji, która zastosuje te same funkcje i właściwości w innych kontrolerach. Podobało mi się, oprócz parametrów. W ten sposób wszystkie twoje ChildCtrls muszą otrzymać $ location.
źródło
Dla tych, którzy zastanawiają się, możesz rozszerzyć kontrolery komponentów w ten sam sposób, używając metody z zaakceptowanej odpowiedzi.
Zastosuj następujące podejście:
Komponent macierzysty (z którego można rozszerzyć):
Komponent potomny (ten rozszerzający się):
Sztuką jest używanie nazwanych kontrolerów zamiast definiowania ich w definicji komponentu.
źródło
Jak wspomniano w zaakceptowanej odpowiedzi, możesz „odziedziczyć” modyfikacje kontrolera nadrzędnego do zakresu $ i innych usług, dzwoniąc:
$controller('ParentCtrl', {$scope: $scope, etc: etc});
w kontrolerze podrzędnym.Nie powiedzie się to jednak , jeśli przyzwyczaiłeś się używać składni kontrolera „as”, na przykład w
Jeśli
foo
został ustawiony w kontrolerze nadrzędnym (przezthis.foo = ...
), kontroler podrzędny nie będzie miał do niego dostępu.Jak wspomniano w komentarzach, możesz przypisać wynik $ kontrolera bezpośrednio do zakresu:
Uwaga: Następnie należy usunąć część „jako”
ng-controller=
, ponieważ określasz nazwę instancji w kodzie, a nie szablon.źródło
Używałem składni „Kontroler jako”
vm = this
i chciałem odziedziczyć kontroler. Miałem problemy, jeśli mój kontroler nadrzędny miał funkcję, która modyfikowała zmienną.Korzystając z odpowiedzi IProblemFactory i Salman Abbas , wykonałem następujące czynności, aby uzyskać dostęp do zmiennych nadrzędnych:
źródło
Możesz użyć prostego mechanizmu dziedziczenia JavaScript. Nie zapomnij również przekazać potrzebnych usług kątowych, aby wywołać metodę .call.
źródło
Przejrzyj poniżej wspomniany link do feartue AngularJs feartue.
Controller-Inheritance-in-angularjs
źródło