J'essaie de voir s'il existe un moyen simple d'accéder à la portée interne d'un contrôleur via une fonction javascript externe (totalement sans rapport avec le contrôleur cible)
J'ai vu sur quelques autres questions ici que
angular.element("#scope").scope();
récupérerait la portée d'un élément DOM, mais mes tentatives ne donnent actuellement aucun résultat correct.
Voici le jsfiddle: http://jsfiddle.net/sXkjc/5/
Je suis actuellement en train de passer de JS simple à Angular. La principale raison pour laquelle j'essaie d'y parvenir est de garder le plus possible le code de ma bibliothèque d'origine; économisant la nécessité pour moi d'ajouter chaque fonction au contrôleur.
Des idées sur la façon dont je pourrais y parvenir? Les commentaires sur le violon ci-dessus sont également les bienvenus.
.scope()
des données de débogage doit être activée, mais l' utilisation des données de débogage en production n'est pas recommandée pour des raisons de vitesse. Les solutions ci-dessous semblent tourner autourscope()
Réponses:
Vous devez utiliser $ scope. $ Apply () si vous souhaitez apporter des modifications à une valeur de portée hors du contrôle d'angularjs, comme un gestionnaire d'événements jquery / javascript.
Démo: Fiddle
la source
angular.element("#scope")
ne fonctionne pas, maisangular.element($("#scope"))
fonctionne, vous devez également avoir jqueryCela fait un moment que j'ai posté cette question, mais compte tenu des opinions que cela semble encore obtenir, voici une autre solution que j'ai trouvée au cours de ces derniers mois:
Le code ci-dessus crée essentiellement une fonction appelée
safeApply
qui appelle la$apply
fonction (comme indiqué dans la réponse d'Arun) si et seulement Angular ne passe actuellement pas par l'$digest
étape. D'un autre côté, si Angular est en train de digérer les choses, il exécutera simplement la fonction telle quelle, car cela suffira à signaler à Angular d'effectuer les modifications.De nombreuses erreurs se produisent lorsque vous essayez d'utiliser la
$apply
fonction alors qu'AngularJs en est actuellement à sa$digest
phase. LesafeApply
code ci-dessus est un wrapper sûr pour éviter de telles erreurs.(Remarque: personnellement, j'aime jouer en
safeApply
fonction de$rootScope
pour des raisons de commodité)Exemple:
Démo: http://jsfiddle.net/sXkjc/227/
la source
Une autre façon de faire est:
la source
nous pouvons l'appeler après avoir chargé
http://jsfiddle.net/gentletech/s3qtv/3/
la source
Cela fait longtemps que je n'ai pas posé cette question, mais voici une réponse qui ne nécessite pas jquery:
la source
Voici une solution réutilisable: http://jsfiddle.net/flobar/r28b0gmq/
la source
Vous pouvez également essayer:
la source
La réponse acceptée est excellente. Je voulais regarder ce qui arrive à la lunette angulaire dans le contexte de
ng-repeat
. Le fait est qu'Angular créera une sous-portée pour chaque élément répété. Lors de l'appel à une méthode définie sur l'original$scope
, qui conserve sa valeur d'origine (en raison de la fermeture de javascript). Cependant, lethis
fait référence à la portée / à l'objet appelant. Cela fonctionne bien, tant que vous savez clairement quand$scope
etthis
sont les mêmes et quand ils sont différents. hthVoici un violon qui illustre la différence: https://jsfiddle.net/creitzel/oxsxjcyc/
la source
Je suis débutant, désolé si c'est une mauvaise pratique. Sur la base de la réponse choisie, j'ai fait cette fonction:
Je l'utilise de cette façon:
Au fait, désolé pour mon anglais
la source
accès à la valeur de l'étendue
supposons que programRow.StationAuxiliaryTime est un tableau d'objets
la source
Nous devons utiliser la fonction intégrée Angular Js $ apply pour accéder aux variables de portée ou aux fonctions en dehors de la fonction de contrôleur.
Ceci peut être fait de deux façons :
| * | Méthode 1: Utilisation de l'ID:
| * | Méthode 2: Utilisation de l'init de ng-controller:
la source