Un controller AngularJS può chiamarne un altro?


581

È possibile che un controller ne usi un altro?

Per esempio:

Questo documento HTML stampa semplicemente un messaggio recapitato dal MessageCtrlcontroller nel messageCtrl.jsfile.

<html xmlns:ng="http://angularjs.org/">
<head>
    <meta charset="utf-8" />
    <title>Inter Controller Communication</title>
</head>
<body>
    <div ng:controller="MessageCtrl">
        <p>{{message}}</p>
    </div>

    <!-- Angular Scripts -->
    <script src="http://code.angularjs.org/angular-0.9.19.js" ng:autobind></script>
    <script src="js/messageCtrl.js" type="text/javascript"></script>
</body>
</html>

Il file del controller contiene il seguente codice:

function MessageCtrl()
{
    this.message = function() { 
        return "The current date is: " + new Date().toString(); 
    };
}

Che stampa semplicemente la data corrente;

Se dovessi aggiungere un altro controller, DateCtrlche ha restituito la data in un formato specifico MessageCtrl, come si potrebbe fare? Il framework DI sembra riguardare XmlHttpRequestse accedere ai servizi.


4
Questo thread del gruppo di Google, groups.google.com/d/topic/angular/m_mn-8gnNt4/discussion , discute di 5 modi in cui i controller possono dialogare.
Mark Rajcok,

Ci sono già buone risposte qui, quindi vorrei solo sottolineare che per il particolare caso d'uso menzionato, forse un filtro AngularJS sarebbe una soluzione migliore? Ho pensato di menzionarlo :)
Joe Dyndale,

Risposte:


705

Esistono diversi modi per comunicare tra i controller.

Il migliore è probabilmente condividere un servizio:

function FirstController(someDataService) 
{
  // use the data service, bind to template...
  // or call methods on someDataService to send a request to server
}

function SecondController(someDataService) 
{
  // has a reference to the same instance of the service
  // so if the service updates state for example, this controller knows about it
}

Un altro modo è emettere un evento nell'ambito:

function FirstController($scope) 
{
  $scope.$on('someEvent', function(event, args) {});
  // another controller or even directive
}

function SecondController($scope) 
{
  $scope.$emit('someEvent', args);
}

In entrambi i casi, puoi comunicare anche con qualsiasi direttiva.


4
Hia, Il primo esempio richiederebbe che la pagina Web sia a conoscenza di tutti i servizi nello stack. Che sembra un cattivo odore (?). Come nel secondo caso, la pagina Web non dovrebbe fornire l'argomento $ scope?
BanksySan,

54
Che cosa? Perché? Tutti i controller vengono iniettati dal DI di Angular.
Vojta,

7
@JoshNoe in 1 / hai due controller (o più) ed entrambi ottengono un servizio identico / condiviso. Quindi, hai diversi modi per comunicare, alcuni dei quali hai menzionato. Deciderei in base al tuo caso d'uso specifico. È possibile inserire la logica / lo stato condivisi nel servizio ed entrambi i controller delegano solo a quel servizio o addirittura esportano il servizio nel modello. Naturalmente, il servizio può anche generare eventi ...
Vojta,

137
Venendo a questo in ritardo: voi ragazzi sapete che state discutendo con THE Vojta di Google che lavora su AngularJS, giusto? :)
Suman,

16
Non era ovvio per me che nel mio HTML il controller che emettesse eventi dovesse essere un nodo figlio del controller di ascolto per funzionare.
Djangonaut,

122

Vedi questo violino: http://jsfiddle.net/simpulton/XqDxG/

Guarda anche il seguente video: Comunicazione tra controller

html:

<div ng-controller="ControllerZero">
  <input ng-model="message" >
  <button ng-click="handleClick(message);">LOG</button>
</div>

<div ng-controller="ControllerOne">
  <input ng-model="message" >
</div>

<div ng-controller="ControllerTwo">
  <input ng-model="message" >
</div>

javascript:

var myModule = angular.module('myModule', []);
myModule.factory('mySharedService', function($rootScope) {
  var sharedService = {};

  sharedService.message = '';

  sharedService.prepForBroadcast = function(msg) {
    this.message = msg;
    this.broadcastItem();
  };

  sharedService.broadcastItem = function() {
    $rootScope.$broadcast('handleBroadcast');
  };

  return sharedService;
});

function ControllerZero($scope, sharedService) {
  $scope.handleClick = function(msg) {
    sharedService.prepForBroadcast(msg);
  };

  $scope.$on('handleBroadcast', function() {
    $scope.message = sharedService.message;
  });        
}

function ControllerOne($scope, sharedService) {
  $scope.$on('handleBroadcast', function() {
    $scope.message = 'ONE: ' + sharedService.message;
  });        
}

function ControllerTwo($scope, sharedService) {
  $scope.$on('handleBroadcast', function() {
    $scope.message = 'TWO: ' + sharedService.message;
  });
}

ControllerZero.$inject = ['$scope', 'mySharedService'];        

ControllerOne.$inject = ['$scope', 'mySharedService'];

ControllerTwo.$inject = ['$scope', 'mySharedService'];

12
Il violino e il video sopra condividono un servizio. Ecco un violino che usa $ scope. $ Emit
Mark Rajcok

1
@adardesign: ADORO leggere lo stesso esempio succinto e significativo delle direttive (grazie anche per questa risposta!)
sscarduzio,

Ottima risposta, utilizzo myModule.service ('mySharedService', function ($ rootScope) {}) invece di myModule.factory ma funziona comunque!
TacoEater,

Eccellente. Tuttavia, ho una domanda: perché hai aggiunto un gestore in ControllerZero? $ scope. $ on ('handleBroadcast', function () {$ scope.message = sharedService.message;});
ZooZ il

Il video fornito è davvero fantastico! Credo che questo sia ciò di cui ho bisogno per verificare lo stato di un altro controller da un altro controller. Tuttavia, ciò non funziona utilizzando la funzione "invoke". Funziona usando l'azione "trigger". In modo così efficace, se un controller esegue un'azione e ha un nuovo stato, allora dovrà trasmettere lo stato e spetta ad altri controller ascoltare quella trasmissione e rispondere di conseguenza. O meglio, eseguire l'azione nel servizio condiviso, quindi trasmettere lo stato. Per favore dimmi se la mia comprensione è corretta.
Tarekahf,

53

Se si desidera chiamare un controller in un altro, sono disponibili quattro metodi

  1. $ rootScope. $ emit () e $ rootScope. $ broadcast ()
  2. Se il secondo controller è figlio, è possibile utilizzare la comunicazione figlio padre.
  3. Usa i servizi
  4. Tipo di hack - con l'aiuto di angular.element ()

1. $ rootScope. $ Emit () e $ rootScope. $ Broadcast ()

Il controller e il suo ambito possono essere distrutti, ma $ rootScope rimane nell'applicazione, ecco perché stiamo prendendo $ rootScope perché $ rootScope è genitore di tutti gli ambiti.

Se stai eseguendo la comunicazione da genitore a figlio e anche il bambino vuole comunicare con i suoi fratelli, puoi usare $ broadcast

Se si sta eseguendo la comunicazione da figlio a genitore, nessun fratello è invocato quindi è possibile utilizzare $ rootScope. $ Emit

HTML

<body ng-app="myApp">
    <div ng-controller="ParentCtrl" class="ng-scope">
      // ParentCtrl
      <div ng-controller="Sibling1" class="ng-scope">
        // Sibling first controller
      </div>
      <div ng-controller="Sibling2" class="ng-scope">
        // Sibling Second controller
        <div ng-controller="Child" class="ng-scope">
          // Child controller
        </div>
      </div>
    </div>
</body>

Codice Angularjs

 var app =  angular.module('myApp',[]);//We will use it throughout the example 
    app.controller('Child', function($rootScope) {
      $rootScope.$emit('childEmit', 'Child calling parent');
      $rootScope.$broadcast('siblingAndParent');
    });

app.controller('Sibling1', function($rootScope) {
  $rootScope.$on('childEmit', function(event, data) {
    console.log(data + ' Inside Sibling one');
  });
  $rootScope.$on('siblingAndParent', function(event, data) {
    console.log('broadcast from child in parent');
  });
});

app.controller('Sibling2', function($rootScope) {
  $rootScope.$on('childEmit', function(event, data) {
    console.log(data + ' Inside Sibling two');
  });
  $rootScope.$on('siblingAndParent', function(event, data) {
    console.log('broadcast from child in parent');
  });
});

app.controller('ParentCtrl', function($rootScope) {
  $rootScope.$on('childEmit', function(event, data) {
    console.log(data + ' Inside parent controller');
  });
  $rootScope.$on('siblingAndParent', function(event, data) {
    console.log('broadcast from child in parent');
  });
});

Nella console di codice sopra di $ emit 'childEmit' non chiamerà all'interno dei fratelli minori e chiamerà all'interno solo dei genitori, dove $ broadcast viene chiamato anche all'interno dei fratelli e dei genitori. Questo è il luogo in cui le prestazioni entrano in azione. $ Emit è preferibile, se si utilizza la comunicazione figlio-genitore perché salta alcuni controlli sporchi.

2. Se il secondo controller è figlio, è possibile utilizzare la comunicazione padre figlio

È uno dei metodi migliori, se vuoi fare una comunicazione genitore figlio dove un bambino vuole comunicare con un genitore immediato, allora non avrebbe bisogno di alcun tipo $ broadcast o $ emit ma se vuoi fare comunicazione da genitore a figlio, allora devi usa il servizio o $ broadcast

Ad esempio HTML: -

<div ng-controller="ParentCtrl">
 <div ng-controller="ChildCtrl">
 </div>
</div>

Angularjs

 app.controller('ParentCtrl', function($scope) {
   $scope.value='Its parent';
      });
  app.controller('ChildCtrl', function($scope) {
   console.log($scope.value);
  });

Ogni volta che si utilizza la comunicazione figlio per genitore, Angularjs cercherà una variabile all'interno del figlio. Se non è presente all'interno, sceglierà di visualizzare i valori all'interno del controllore padre.

3. Utilizzare i servizi

AngularJS supporta i concetti di "Separazione delle preoccupazioni" utilizzando l'architettura dei servizi. I servizi sono funzioni javascript e sono tenuti a svolgere solo attività specifiche, il che li rende una singola entità che è gestibile e verificabile. Servizi utilizzati per iniettare utilizzando il meccanismo di iniezione di dipendenza di Angularjs.

Codice Angularjs:

app.service('communicate',function(){
  this.communicateValue='Hello';
});

app.controller('ParentCtrl',function(communicate){//Dependency Injection
  console.log(communicate.communicateValue+" Parent World");
});

app.controller('ChildCtrl',function(communicate){//Dependency Injection
  console.log(communicate.communicateValue+" Child World");
});

Darà in uscita Hello Child World e Hello Parent World. Secondo i documenti angolari dei servizi Singletons - Ogni componente dipendente da un servizio ottiene un riferimento alla singola istanza generata dalla fabbrica di servizi .

4. Tipo di hack - con l'aiuto di angular.element ()

Questo metodo ottiene scope () dall'elemento con il suo metodo Id / unique class.angular.element () restituisce element e scope () fornisce la variabile $ scope di un'altra variabile usando la variabile $ scope di un controller all'interno di un'altra non è una buona pratica.

HTML: -

<div id='parent' ng-controller='ParentCtrl'>{{varParent}}
 <span ng-click='getValueFromChild()'>Click to get ValueFormChild</span>
 <div id='child' ng-controller='childCtrl'>{{varChild}}
   <span ng-click='getValueFromParent()'>Click to get ValueFormParent </span>
 </div>
</div>

Angularjs: -

app.controller('ParentCtrl',function($scope){
 $scope.varParent="Hello Parent";
  $scope.getValueFromChild=function(){
  var childScope=angular.element('#child').scope();
  console.log(childScope.varChild);
  }
});

app.controller('ChildCtrl',function($scope){
 $scope.varChild="Hello Child";
  $scope.getValueFromParent=function(){
  var parentScope=angular.element('#parent').scope();
  console.log(parentScope.varParent);
  }
}); 

Nel codice sopra i controller mostrano il proprio valore su HTML e quando si fa clic sul testo si ottengono i valori nella console di conseguenza. Se si fa clic sull'intervallo dei controller parent, il browser consolerà il valore di child e viceversa.


52

Ecco un esempio di una pagina di due controller che condividono i dati di servizio:

<!doctype html>
<html ng-app="project">
<head>
    <title>Angular: Service example</title>
    <script src="http://code.angularjs.org/angular-1.0.1.js"></script>
    <script>
var projectModule = angular.module('project',[]);

projectModule.factory('theService', function() {  
    return {
        thing : {
            x : 100
        }
    };
});

function FirstCtrl($scope, theService) {
    $scope.thing = theService.thing;
    $scope.name = "First Controller";
}

function SecondCtrl($scope, theService) {   
    $scope.someThing = theService.thing; 
    $scope.name = "Second Controller!";
}
    </script>
</head>
<body>  
    <div ng-controller="FirstCtrl">
        <h2>{{name}}</h2>
        <input ng-model="thing.x"/>         
    </div>

    <div ng-controller="SecondCtrl">
        <h2>{{name}}</h2>
        <input ng-model="someThing.x"/>             
    </div>
</body>
</html>

Anche qui: https://gist.github.com/3595424


E se gli theServiceaggiornamenti thing.x, allora quel cambiamento si propaga automaticamente ai <input> s in FirstCtrle SecondCtrl, giusto? E si può anche cambiare thing.xdirettamente tramite uno dei due <input> s (giusto?).
KajMagnus,

4
Sì. Tutti i servizi angolari sono singoli punti di applicazione, il che significa che esiste solo un'istanza di Service. Riferimento: docs.angularjs.org/guide/dev_guide.services.creating_services
escl.

Il link nel mio commento precedente è 404, quindi ecco la guida dei servizi, oggi, che nota che i servizi sono singoli: docs.angularjs.org/guide/services
exclsr

1
@exclsr Sì! Scusa se l'ho perso prima
CodyBugstein il

3
Di gran lunga l'esempio migliore che ho visto finora sul web. Grazie
Sevenearths,

33

Se stai cercando di emettere e trasmettere eventi per condividere dati o chiamare funzioni tra controller , ti preghiamo di guardare questo link : e controllare la risposta zbynour(risposta con il massimo dei voti). Sto citando la sua risposta !!!

Se l'ambito di firstCtrl è genitore dell'ambito secondCtrl, il codice dovrebbe funzionare sostituendo $ emit con $ broadcast in firstCtrl:

function firstCtrl($scope){
    $scope.$broadcast('someEvent', [1,2,3]);
}

function secondCtrl($scope){
    $scope.$on('someEvent', function(event, mass) {console.log(mass)});
}

Nel caso in cui non vi sia alcuna relazione genitore-figlio tra gli ambiti, è possibile iniettare $ rootScope nel controller e trasmettere l'evento a tutti gli ambiti figlio (ovvero anche secondCtrl).

function firstCtrl($rootScope){
    $rootScope.$broadcast('someEvent', [1,2,3]);
}

Infine, quando è necessario inviare l'evento dal controller figlio agli ambiti verso l'alto, è possibile utilizzare $ scope. $ Emit. Se l'ambito di firstCtrl è genitore dell'ambito secondCtrl:

function firstCtrl($scope){
    $scope.$on('someEvent', function(event, data) { console.log(data); });
}

function secondCtrl($scope){
    $scope.$emit('someEvent', [1,2,3]);
}

24

Altri due violini: (approccio non di servizio)

1) Per controllore genitore-figlio - Utilizzo $scopedel controllore genitore per emettere / trasmettere eventi. http://jsfiddle.net/laan_sachin/jnj6y/

2) Utilizzo $rootScopeattraverso controller non correlati. http://jsfiddle.net/VxafF/


Quale motivo di tutta questa complessità con gli eventi? Perché non fare qualcosa del genere? jsfiddle.net/jnj6y/32
Dfr

Dipende da che tipo di relazione Genitore Figlio ha ragione. Potrebbe essere un'erarchia DOM, se gli eventi del caso ti consentissero di separare le cose.
DarkKnight,

17

In realtà l'utilizzo dell'emissione e della trasmissione è inefficace perché l'evento bolle su e giù nella gerarchia dell'ambito che può facilmente degradare in un imbottigliamento delle prestazioni per un'applicazione complessa.

Suggerirei di utilizzare un servizio. Ecco come l'ho implementato di recente in uno dei miei progetti: https://gist.github.com/3384419 .

Idea di base: registra un bus pub-sub / evento come servizio. Quindi iniettare quel bus eventi dove mai è necessario abbonarsi o pubblicare eventi / argomenti.


5

Conosco anche questo.

angular.element($('#__userProfile')).scope().close();

Ma non lo uso troppo, perché non mi piace usare i selettori jQuery in codice angolare.


la migliore risposta So simple and easy ... =)
zVictor

3
@zVictor, questo è davvero un tipo di approccio "last resort". Funziona, ma sta uscendo dall'ambito per forzare il tuo ritorno. Questo sta usando la manipolazione DOM per forzare qualcosa da fare invece di farlo programmaticamente. È semplice, funziona, ma non è scalabile.
Brian Noah,

2
@BrianNoah, vero. Va bene usare questo codice per prototipi o alcuni esperimenti, ma non per il codice di produzione.
Andrey Korchak,

1
Questo è il peggio che si può fare. Manipolazione DOM nei servizi e accesso diretto all'ambito.
Mattia Franchetto,

3

Esiste un metodo non dipendente dai servizi $broadcasto $emit. Non è adatto in tutti i casi, ma se hai 2 controller correlati che possono essere astratti in direttive, puoi usare l' requireopzione nella definizione della direttiva. Questo è molto probabilmente il modo in cui ngModel e ngForm comunicano. È possibile utilizzarlo per comunicare tra i controller della direttiva nidificati o sullo stesso elemento.

Per una situazione genitore / figlio, l'uso sarebbe il seguente:

<div parent-directive>
  <div inner-directive></div>
</div>

E i punti principali per farlo funzionare: sulla direttiva padre, con i metodi da chiamare, è necessario definirli su this(non su $scope):

controller: function($scope) {
  this.publicMethodOnParentDirective = function() {
    // Do something
  }
}

Sulla definizione della direttiva figlio, è possibile utilizzare l' requireopzione in modo che il controller principale venga passato alla funzione di collegamento (in modo da poter quindi richiamare le funzioni su di esso dalla scopedirettiva figlio.

require: '^parentDirective',
template: '<span ng-click="onClick()">Click on this to call parent directive</span>',
link: function link(scope, iElement, iAttrs, parentController) {
  scope.onClick = function() {
    parentController.publicMethodOnParentDirective();
  }
}

Quanto sopra è disponibile all'indirizzo http://plnkr.co/edit/poeq460VmQER8Gl9w8Oz?p=preview

Una direttiva di pari livello viene utilizzata in modo simile, ma entrambe le direttive sullo stesso elemento:

<div directive1 directive2>
</div>

Utilizzato creando un metodo su directive1:

controller: function($scope) {
  this.publicMethod = function() {
    // Do something
  }
}

E in direttiva2 questo può essere chiamato usando l' requireopzione che provoca il passaggio di siblingController alla funzione link:

require: 'directive1',
template: '<span ng-click="onClick()">Click on this to call sibling directive1</span>',
link: function link(scope, iElement, iAttrs, siblingController) {
  scope.onClick = function() {
    siblingController.publicMethod();
  }
}

Questo può essere visto su http://plnkr.co/edit/MUD2snf9zvadfnDXq85w?p=preview .

Gli usi di questo?

  • Parent: qualsiasi caso in cui gli elementi figlio debbano "registrarsi" con un genitore. Proprio come la relazione tra ngModel e ngForm. Questi possono aggiungere determinati comportamenti che possono influenzare i modelli. Potresti avere anche qualcosa di puramente basato su DOM, in cui un elemento genitore deve gestire le posizioni di determinati figli, dire per gestire o reagire allo scorrimento.

  • Fratello: consentire a una direttiva di modificare il suo comportamento. ngModel è il caso classico, per aggiungere parser / validazione all'utilizzo di ngModel sugli input.


3

Non so se questo è fuori standard, ma se hai tutti i tuoi controller nello stesso file, puoi fare qualcosa del genere:

app = angular.module('dashboardBuzzAdmin', ['ngResource', 'ui.bootstrap']);

var indicatorsCtrl;
var perdiosCtrl;
var finesCtrl;

app.controller('IndicatorsCtrl', ['$scope', '$http', function ($scope, $http) {
  indicatorsCtrl = this;
  this.updateCharts = function () {
    finesCtrl.updateChart();
    periodsCtrl.updateChart();
  };
}]);

app.controller('periodsCtrl', ['$scope', '$http', function ($scope, $http) {
  periodsCtrl = this;
  this.updateChart = function() {...}
}]);

app.controller('FinesCtrl', ['$scope', '$http', function ($scope, $http) {
  finesCtrl = this;
  this.updateChart = function() {...}
}]);

Come puoi vedere, quando si chiama updateCharts, Ctrl chiama le funzioni updateChart degli altri due controller.


2

È possibile iniettare il servizio '$ controller' nel controller principale (MessageCtrl) e quindi istanziare / iniettare il controller secondario (DateCtrl) utilizzando:
$scope.childController = $controller('childController', { $scope: $scope.$new() });

Ora puoi accedere ai dati dal tuo controllore figlio chiamando i suoi metodi in quanto è un servizio.
Fammi sapere se c'è qualche problema.


1

Di seguito è riportato un publish-subscribeapproccio che è indipendente da Angular JS.

Cerca Param Controller

//Note: Multiple entities publish the same event
regionButtonClicked: function () 
{
        EM.fireEvent('onSearchParamSelectedEvent', 'region');
},

plantButtonClicked: function () 
{
        EM.fireEvent('onSearchParamSelectedEvent', 'plant');
},

Cerca Scelte Controller

//Note: It subscribes for the 'onSearchParamSelectedEvent' published by the Search Param Controller
localSubscribe: function () {
        EM.on('onSearchParamSelectedEvent', this.loadChoicesView, this);

});


loadChoicesView: function (e) {

        //Get the entity name from eData attribute which was set in the event manager
        var entity = $(e.target).attr('eData');

        console.log(entity);

        currentSelectedEntity = entity;
        if (entity == 'region') {
            $('.getvalue').hide();
            this.loadRegionsView();
            this.collapseEntities();
        }
        else if (entity == 'plant') {
            $('.getvalue').hide();
            this.loadPlantsView();
            this.collapseEntities();
        }


});

Manager di eventi

myBase.EventManager = {

    eventArray:new Array(),


    on: function(event, handler, exchangeId) {
        var idArray;
        if (this.eventArray[event] == null) {
            idArray = new Array();
        } else { 
            idArray = this.eventArray[event];
        }
        idArray.push(exchangeId);
        this.eventArray[event] = idArray;

        //Binding using jQuery
        $(exchangeId).bind(event, handler);
    },

    un: function(event, handler, exchangeId) {

        if (this.eventArray[event] != null) {
            var idArray = this.eventArray[event];
            idArray.pop(exchangeId);
            this.eventArray[event] = idArray;

            $(exchangeId).unbind(event, handler);
        }
    },

    fireEvent: function(event, info) {
        var ids = this.eventArray[event];

        for (idindex = 0; idindex < ids.length; idindex++) {
            if (ids[idindex]) {

                //Add attribute eData
                $(ids[idindex]).attr('eData', info);
                $(ids[idindex]).trigger(event);
            }
        }
    }
};

Globale

var EM = myBase.EventManager;

1

Nell'angolo 1.5 questo può essere realizzato facendo quanto segue:

(function() {
  'use strict';

  angular
    .module('app')
    .component('parentComponent',{
      bindings: {},
      templateUrl: '/templates/products/product.html',
      controller: 'ProductCtrl as vm'
    });

  angular
    .module('app')
    .controller('ProductCtrl', ProductCtrl);

  function ProductCtrl() {
    var vm = this;
    vm.openAccordion = false;

    // Capture stuff from each of the product forms
    vm.productForms = [{}];

    vm.addNewForm = function() {
      vm.productForms.push({});
    }
  }

}());

Questo è il componente principale. In questo ho creato una funzione che spinge un altro oggetto nel mio productFormsarray - nota - questo è solo il mio esempio, questa funzione può essere davvero qualsiasi cosa.

Ora possiamo creare un altro componente che utilizzerà require:

(function() {
  'use strict';

  angular
    .module('app')
    .component('childComponent', {
      bindings: {},
      require: {
        parent: '^parentComponent'
      },
      templateUrl: '/templates/products/product-form.html',
      controller: 'ProductFormCtrl as vm'
    });

  angular
    .module('app')
    .controller('ProductFormCtrl', ProductFormCtrl);

  function ProductFormCtrl() {
    var vm = this;

    // Initialization - make use of the parent controllers function
    vm.$onInit = function() {
      vm.addNewForm = vm.parent.addNewForm;
    };  
  }

}());

Qui il componente figlio sta creando un riferimento alla funzione del componente genitori addNewFormche può quindi essere associata all'HTML e chiamata come qualsiasi altra funzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.