Comment puis-je appeler la fonction définie sous le contrôleur à partir de n'importe quel endroit de la page Web (en dehors du composant du contrôleur)?
Cela fonctionne parfaitement lorsque j'appuie sur le bouton "get". Mais je dois l'appeler de l'extérieur du contrôleur div. La logique est la suivante: par défaut, mon div est masqué. Quelque part dans le menu de navigation, j'appuie sur un bouton et il devrait afficher () mon div et exécuter la fonction "get". Comment puis-je y parvenir?
Ma page Web est:
<div ng-controller="MyController">
<input type="text" ng-model="data.firstname" required>
<input type='text' ng-model="data.lastname" required>
<form ng-submit="update()"><input type="submit" value="update"></form>
<form ng-submit="get()"><input type="submit" value="get"></form>
</div>
Mon js:
function MyController($scope) {
// default data and structure
$scope.data = {
"firstname" : "Nicolas",
"lastname" : "Cage"
};
$scope.get = function() {
$.ajax({
url: "/php/get_data.php?",
type: "POST",
timeout: 10000, // 10 seconds for getting result, otherwise error.
error:function() { alert("Temporary error. Please try again...");},
complete: function(){ $.unblockUI();},
beforeSend: function(){ $.blockUI()},
success: function(data){
json_answer = eval('(' + data + ')');
if (json_answer){
$scope.$apply(function () {
$scope.data = json_answer;
});
}
}
});
};
$scope.update = function() {
$.ajax({
url: "/php/update_data.php?",
type: "POST",
data: $scope.data,
timeout: 10000, // 10 seconds for getting result, otherwise error.
error:function() { alert("Temporary error. Please try again...");},
complete: function(){ $.unblockUI();},
beforeSend: function(){ $.blockUI()},
success: function(data){ }
});
};
}
get()
de MyController depuis un autre contrôleur?Réponses:
Voici un moyen d'appeler la fonction du contrôleur de l'extérieur:
où
get()
est une fonction de votre contrôleur.Vous pouvez changer
à
Si vous utilisez jQuery.
De plus, si votre fonction implique de changer quoi que ce soit sur votre vue, vous devez appeler
pour appliquer les modifications.
Une autre chose à noter est que les étendues sont initialisées après le chargement de la page, donc l'appel de méthodes en dehors de l'étendue doit toujours être fait après le chargement de la page. Sinon, vous n'obtiendrez pas du tout la portée.
METTRE À JOUR:
Avec les dernières versions d'angular, vous devez utiliser
Et oui, c'est, en fait, une mauvaise pratique , mais parfois vous avez juste besoin que les choses soient faites vite et sale.
la source
$apply
pièce pour moi, jusqu'à ce que j'encapsule le code dans une fonction, par exemple..scope.$apply(function() { scope.get() });
angular.element(document.getElementById('yourControllerElementID')).scope().controller;
For ex. si utilisation:angular.element(document.getElementById('controller')).scope().get()
jette et erreur non définie, mais si je l'utilise,angular.element(document.getElementById('controller')).scope().controller.get()
cela fonctionne.scope()
dans leangular.element(...)
, car il renvoie undefined et un vardump de l'élément / objet angulaire indique que la fonctionscope
est située dans le__proto__
-object.J'ai trouvé un exemple sur Internet.
Un gars a écrit ce code et a parfaitement fonctionné
HTML
JAVASCRIPT
Démo
* J'ai fait quelques modifications, voir l'original: police JSfiddle
la source
La solution a
angular.element(document.getElementById('ID')).scope().get()
cessé de fonctionner pour moi dans angulaire 1.5.2. Sombody mentionne dans un commentaire que cela ne fonctionne pas non plus dans la version 1.4.9. Je l'ai corrigé en stockant la portée dans une variable globale:appel depuis un code personnalisé:
si vous souhaitez limiter la portée à cette méthode uniquement. Pour minimiser l'exposition de toute la portée. utilisez la technique suivante.
appel depuis un code personnalisé:
la source
La réponse de Dmitry fonctionne très bien. Je viens de faire un exemple simple en utilisant la même technique.
jsfiddle: http://jsfiddle.net/o895a8n8/5/
.
la source
Je préfère inclure l'usine en tant que dépendances sur les contrôleurs plutôt que de leur injecter leur propre ligne de code: http://jsfiddle.net/XqDxG/550/
ControllerZero. $ Inject = ['$ scope', 'mySharedService'];la source
Il peut être utile de se demander si le fait d'avoir votre menu sans portée associée est la bonne voie à suivre. Ce n'est pas vraiment la voie angulaire.
Mais, si c'est la voie à suivre, vous pouvez le faire en ajoutant les fonctions à $ rootScope, puis dans ces fonctions en utilisant $ broadcast pour envoyer des événements. votre contrôleur utilise ensuite $ on pour écouter ces événements.
Une autre chose à considérer si vous finissez par avoir votre menu sans portée est que si vous avez plusieurs routes, tous vos contrôleurs devront avoir leur propre mise à jour et obtenir des fonctions. (cela suppose que vous avez plusieurs contrôleurs)
la source
J'utilise pour travailler avec $ http, quand je veux obtenir des informations d'une ressource, je fais ce qui suit:
Et le code dans le contrôleur:
J'envoie au service quelle fonction doit appeler dans le contrôleur
la source
J'ai plusieurs routes et plusieurs contrôleurs, donc je n'ai pas pu obtenir la réponse acceptée. J'ai trouvé que l'ajout de la fonction à la fenêtre fonctionne:
Ensuite, en dehors du contrôleur, cela peut être fait:
la source
Appelez la fonction Angular Scope depuis l'extérieur du contrôleur.
la source
Je suis un utilisateur du framework Ionic et celui que j'ai trouvé qui fournirait systématiquement la portée $ du contrôleur actuel est:
angular.element(document.querySelector('ion-view[nav-view="active"]')).scope()
Je soupçonne que cela peut être modifié pour s'adapter à la plupart des scénarios quel que soit le cadre (ou non) en trouvant la requête qui ciblera le ou les éléments DOM spécifiques qui ne sont disponibles que pendant une instance de contrôleur donnée.
la source