Je sais que cela est contraire aux règles d'Angularjs.
Parlons d'abord de la scène.
L'utilisateur clique sur le bouton "Ajouter" sur la page A et window.open ouvre une page B. Après avoir rempli les informations sur la page B, cliquez sur Enregistrer et souhaite les faire écho à la page A. Soumettez-le ensuite au responsable du traitement avec quelques informations sur la page A.
Parce que je suis nouveau sur Angularjs, j'utilise toujours la page B opener.document.getElementById pour définir la page parent (la valeur d'entrée cachée de la page A).
Cependant, il semble que la vue d'entrée sur la page ait changé, mais le modèle réel n'a pas changé du tout et les valeurs obtenues dans le contrôleur sont toutes indéfinies
;
Je voudrais demander conseil
1. Si c'est écrit comme ceci, comment faut-il procéder pour que le contrôleur puisse obtenir la valeur d'entrée renvoyée par la page B cachée.
2. Si vous suivez la méthode d'écriture Angularjs, comment devrait-elle changer ?
Page A ci-jointe :
<a href="javascript:void(0);" ng-click="add()" >新增</a>
<input id = "abv" ng-model="abv" class="intxt" type="text">
<a href="javascript:void(0);" ng-click="save()" id = "save">保存</a>
A.js :
$scope.add = function(){
var openCustomer = window.open('B.html');
};
$scope.save = function(){
console.log('save ' + $scope.abv);
};
Page B :
this.opener.document.getElementById("abv").value = document.getElementById("a").value;
this.opener.document.getElementById("save").click();
Il vous suffit de modifier l'entrée puis d'ajouter un événement à l'aide de JQ
$("#cert_valid_from").val(date1).trigger('change');
Déclencher principalement la simulation déclenche un événement de changement
Code de référence
A.js :
Page B
Désormais, l'alerte dont vous avez besoin est disponible dans A.js
$scope.abv
.Mais il convient tout de même de noter que cette approche est totalement une solution de contournement et est fortement déconseillée
La raison est que je prévois d'utiliser un plug-in Chrome pour créer un plug-in qui m'aide automatiquement à cliquer sur les boutons et à saisir des éléments. Cependant, le projet est réalisé avec angulaire. Définir la valeur d'entrée avec js n'est pas suffisant. .Je dois mettre à jour la valeur du modèle, ce qui est une perte de temps. Il a fallu beaucoup d'efforts pour découvrir que l'entrée devait être déclenchée au lieu d'un changement, puis il a fallu beaucoup d'efforts pour résoudre le problème du cross-frame. opérations. . . .
Merde, il m'a fallu beaucoup de temps pour trouver la réponse. J'ai vraiment travaillé dur pour trouver la réponse.
Enfin, je l'ai compris : après que js ait modifié la valeur d'entrée, un événement doit se produire. être déclenché au début. Je pensais que c'était un changement, mais après beaucoup de travail acharné, j'ai finalement découvert que c'était une entrée $('input').val(123).trigger('input') était ok.
Cependant, mon projet est plus compliqué. a.html fait référence à b.html via iframe. Les deux HTML ont un ensemble de jquery et d'angular, donc le jquery de b.html doit être utilisé pour déclencher l'entrée (cela peut être le cas). un bug), c'est-à-dire window.frames["f1"].contentWindow .$('input').val('55555555555').trigger('input') au lieu de
$('input',window .frames["f1"].contentWindow.document).val('55555555555 ').trigger('input')
La valeur ngModel n'est pas mise à jour/affichée
Référence http://www.cnblogs.com/whitewolf/p/ngmodel-zhi-bu-geng-xin-slash-xian-shi.html
Raisons
1. La valeur du modèle ne répond pas aux conditions de validation du formulaire, donc angulaire ne la rendra pas
2 En raison du mécanisme spécial d'héritage de chaîne de prototypes de JavaScript, l'attribution des attributs dans $scope ne peut pas être mise à jour. à la portée parent$
Solution rapide pour la raison 2 : ajoutez "." à la valeur d'attribut de ngModel, puis la récupération de la chaîne du prototype JavaScript sera lancée.