Comment appeler une méthode définie dans la portée enfant à partir de sa portée parent?
function ParentCntl() {
// I want to call the $scope.get here
}
function ChildCntl($scope) {
$scope.get = function() {
return "LOL";
}
}
Comment appeler une méthode définie dans la portée enfant à partir de sa portée parent?
function ParentCntl() {
// I want to call the $scope.get here
}
function ChildCntl($scope) {
$scope.get = function() {
return "LOL";
}
}
Réponses:
Vous pouvez utiliser $broadcastdu parent à un enfant:
function ParentCntl($scope) {
$scope.msg = "";
$scope.get = function(){
$scope.$broadcast ('someEvent');
return $scope.msg;
}
}
function ChildCntl($scope) {
$scope.$on('someEvent', function(e) {
$scope.$parent.msg = $scope.get();
});
$scope.get = function(){
return "LOL";
}
}
Violon de travail: http://jsfiddle.net/wUPdW/2/
MISE À JOUR : Il existe une autre version, moins couplée et plus testable:
function ParentCntl($scope) {
$scope.msg = "";
$scope.get = function(){
$scope.$broadcast ('someEvent');
return $scope.msg;
}
$scope.$on('pingBack', function(e,data) {
$scope.msg = data;
});
}
function ChildCntl($scope) {
$scope.$on('someEvent', function(e) {
$scope.$emit("pingBack", $scope.get());
});
$scope.get = function(){
return "LOL";
}
}
Violon: http://jsfiddle.net/uypo360u/
$scope.$parentou dans $scope.$parent.$parent, etc.)? Ah, oui: passez un callback en params! :)
$emitd'un enfant à un parent. Je pense qu'il est temps de mettre à jour ma réponse ..
$parent
$broadcastet vous pouvez éliminer pingBackcomplètement le.
Laissez-moi vous suggérer une autre solution:
var app = angular.module("myNoteApp", []);
app.controller("ParentCntl", function($scope) {
$scope.obj = {};
});
app.controller("ChildCntl", function($scope) {
$scope.obj.get = function() {
return "LOL";
};
});
Moins de code et utilisant l'héritage prototypique.
$scope.obj.get()soit une fonction valide.
Enregistrez la fonction de l'enfant sur le parent lors de l'initialisation de l'enfant. J'ai utilisé la notation «comme» pour plus de clarté dans le modèle.
MODÈLE
<div ng-controller="ParentCntl as p">
<div ng-controller="ChildCntl as c" ng-init="p.init(c.get)"></div>
</div>
CONTRÔLEURS
...
function ParentCntl() {
var p = this;
p.init = function(fnToRegister) {
p.childGet = fnToRegister;
};
// call p.childGet when you want
}
function ChildCntl() {
var c = this;
c.get = function() {
return "LOL";
};
}
"Mais", dites-vous, " ng-init n'est pas censé être utilisé de cette façon !". Eh bien, oui, mais
Je dis que c'est une bonne utilisation pour cela. Si vous souhaitez me rejeter, veuillez commenter avec des raisons! :)
J'aime cette approche car elle garde les composants plus modulaires. Les seules liaisons se trouvent dans le modèle et cela signifie que
Cette approche approche plus étroitement l'idée de Tero de modulariser avec des directives (notez que dans son exemple modularisé, contestantsest passée de la directive parent à la directive "enfant" DANS LE TEMPLATE).
En effet, une autre solution pourrait être d'envisager de mettre en œuvre le ChildCntlcomme une directive et d'utiliser la &liaison pour enregistrer la initméthode.
Vous pouvez créer un objet enfant.
var app = angular.module("myApp", []);
app.controller("ParentCntl", function($scope) {
$scope.child= {};
$scope.get = function(){
return $scope.child.get(); // you can call it. it will return 'LOL'
}
// or you can call it directly like $scope.child.get() once it loaded.
});
app.controller("ChildCntl", function($scope) {
$scope.obj.get = function() {
return "LOL";
};
});
Ici, l'enfant prouve la destination de la méthode get.