angulaire.js - Le problème de $scope qui ne s'actualise pas en angulaire
ringa_lee
ringa_lee 2017-05-15 16:51:08
0
5
1037

Excusez-moi, j'ai créé une page dans laquelle la partie d'en-tête est importée de ng include (il y a un contrôleur de connexion dedans pour déterminer s'il faut afficher le bouton de connexion. En même temps, j'ai défini une page de connexion dans ngroute, qui utilise également logincontroller. J'ai passé $http Après avoir obtenu les données, je rappelle la portée, mais la page d'affichage n'est pas mise à jour. Il semble que le même contrôleur ait deux portées. (J'ai trouvé que lorsque nginclude est terminé, les éléments du contrôleur de connexion seront exécutés une fois et seront à nouveau déclenchés lors de l'entrée dans la page de connexion)

J'ai aussi essayé $apply() comme mentionné en ligne et le résultat sera une erreur

    function($scope,$http,$location,$timeout,userService,notifyService) {
        $scope.login = {
            userid:"bbbbb",
        }
        $scope.user={islogged:0}
        $timeout(function(){ 
            //$scope.user={islogged:1}
            console.log($scope.user);
        },5000)
        $scope.httplogin = function(){
            $http({
                method:'POST',
                url:server.domain+server.login,
                data:{
                    userid:$scope.login.userid,
                    password:$scope.login.password,
                },
            }).success(function(d){
                if(d.code == 200){
                    $scope.login={userid:1111111}
                    $scope.user={islogged:1}
                    notifyService.make('success',d.data.msg,5)
                }else{
                    alert(d.msg)
                }
            })
        }

Ce ci-dessus est le code du contrôleur, qui contient le consolelog dans le timeout S'il est imprimé, trois apparaîtront à la fois Est-ce parce que j'utilise le même ngcontroller à trois endroits ? le commentaire appelé $scope.user={islogged:1} dans le délai d'attente sera imprimé comme ceci, ce qui est anormal pour ma tâche, j'espère qu'ils sont tous identiques

.
Object {islogged: 0}
Object {islogged: 0}
Object {islogged: 1}

Si vous décommentez $scope.user={islogged:1} et le laissez s'exécuter, les trois contrôleurs seront imprimés normalement.

Object {islogged: 1}
Object {islogged: 1}
Object {islogged: 1}

=================
Je viens de le tester à nouveau, et cela ne modifie que la valeur sous le ngcontroller actuellement déclenché. S'il y a plusieurs ngcontrollers, les valeurs des autres ngcontrollers ne changeront pas, que ce soit sous nginclude ou ngview. Comment synchroniser les données modifiées par le même ngcontroller vers un autre endroit ?

ringa_lee
ringa_lee

ringa_lee

répondre à tous(5)
世界只因有你

Etes-vous sûr que c'est la même portée ? ng-includeUn nouveau périmètre sera créé.

Après avoir lu le code

Il est vrai que chaque contrôleur est une instance distincte et ne s'affecte pas les uns les autres. Vous pouvez envisager de placer l'état des données dans une portée globale (niveau supérieur) ; un meilleur moyen serait de le gérer uniformément via le service

Par exemple :

html<body ng-app="app">

    <p ng-controller="loginCtrl">
        <pre>{{info}}</pre>
    </p>
    <script type="text/javascript">
    var app = angular.module('app', []);

    app.factory('login', ['$timeout', function($timeout){
        var ret = {

            info: {
                isIn: false
            }
        };

        // 模拟ajax请求
        $timeout(function() {
            ret.info.isIn = true;
        }, 1000);

        return ret;
    }]);

    app.controller('loginCtrl', ['$scope', 'login', function($scope, login){

        $scope.info = login.info;
    }])
    </script>
</body>
刘奇

$scope.$apply() ne fonctionne pas ?

漂亮男人

Il est préférable de s'assurer que le $scope que vous voyez à deux endroits a la même portée, et non que l'un d'eux soit une sous-portée de l'autre.

伊谢尔伦

Il vaudrait mieux poster le code~

漂亮男人

J'ai également rencontré le même problème. Lorsque $scope était modifié pour la première fois, les données sur l'interface ne bougeaient pas (par exemple, lorsqu'elle commençait à disparaître), les données changeaient immédiatement. , puis $scope Lorsqu'il change à nouveau, l'interface change en conséquence.

J'ai aussi essayé d'utiliser $apply, mais cela signalerait une longue liste d'erreurs. On dit que quelque chose est déjà utilisé, etc... Je ne comprends pas... J'espère qu'il y a une solution.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal