recherche

Maison  >  Questions et réponses  >  le corps du texte

angular.js - Angular中的变量怎么实时更新


DOM中count和A Controller双向绑定,而A Controller中的count值是从Service中去取的,B Controller可以改变Service中的值。
请问应该怎么实现说B改变Service中的值后DOM也能实时变化呢

怪我咯怪我咯2743 Il y a quelques jours732

répondre à tous(3)je répondrai

  • 滿天的星座

    滿天的星座2017-05-15 16:53:09

    Quant à la situation évoquée par l'affiche, je serai plus prudent et pourra être discutée dans les deux situations suivantes :

    La valeur partagée par le service est un objet

    À ce stade, il vous suffit d'attribuer la valeur au scope normalement, car l'objet est passé par référence, voir exemple :
    code html :

    <p ng-controller="ACtrl">
        <p>A Controller:</p>
    
        <p>count:{{count.number}}</p>
        <input ng-model="count.number"/>
    </p>
    <p ng-controller="BCtrl">
        <p>B Controller:</p>
    
        <p>count:{{count.number}}</p>
        <button ng-click="changeCount()">change Number To 4</button>
    </p>
    

    code service :

    .service('common', function () {
        this.obj = {number: 3};
    });
    

    code du contrôleur :

    .controller('ACtrl', function ($scope, common) {
        $scope.count = common.obj;
    })
    
    .controller('BCtrl', function ($scope, common) {
        $scope.count = common.obj;
    
        $scope.changeCount = function () {
            common.obj.number = 4;
        }
    });
    

    Effet de page :

    Après avoir cliqué sur le bouton Changer le numéro en 4, l'effet de page est :

    Vous pouvez voir que les données sont mises à jour de manière synchrone. Pourquoi un tel effet peut-il se produire ? Il y a deux raisons très importantes :

    • le service est un singleton
    • L'objet est passé par référence

    Une chose à noter est que tout changement de portée ou de service entraînera le changement de l'autre !

    La valeur partagée par le service est un type basique

    Lorsque la valeur partagée est un type de base, la méthode ci-dessus ne peut pas être réalisée. Parce que l’affectation de types de base transmet des valeurs, pas des références. À ce stade, l’interaction entre les deux contrôleurs doit être pilotée par des événements. Regardez le code :
    code html :

    <p ng-controller="ACtrl">
        <p>A Controller:</p>
    
        <p>count:{{count}}</p>
        <input ng-model="count"/>
    </p>
    <p ng-controller="BCtrl">
        <p>B Controller:</p>
    
        <p>count:{{count}}</p>
        <button ng-click="changeCount()">change Number To 4</button>
    </p>
    

    code service :

    .service('common', function () {
        this.number = 3;
    });
    

    code du contrôleur :

    .controller('ACtrl', function ($scope, common) {
        $scope.count = common.number;
    
        $scope.$on('change', function () {
            $scope.count = common.number;
        });
    })
    
    .controller('BCtrl', function ($scope, $rootScope, common) {
        $scope.count = common.number;
    
        $scope.changeCount = function () {
            common.number = 4;
            $rootScope.$broadcast('change');
        }
    });
    

    L'effet de page est le même que le premier.
    $emit et $broadcast entre pairs ne peuvent pas transmettre d'événements, et les événements sont diffusés vers le bas sur rootScope.
    C’est tout. Cela implique beaucoup de choses.
    j'espère vous aider!

    répondre
    0
  • phpcn_u1582

    phpcn_u15822017-05-15 16:53:09

    Vous devez regarder la différence entre le service et l'usine. L'un est construit et l'autre est singleton. Si vous utilisez l'usine, le traitement en B affectera A. Ou vous utilisez la diffusion, Angular a une fonction de diffusion.

    répondre
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-15 16:53:09

    Je comprends que ce que vous voulez demander, c'est comment synchroniser le DOM avec les données Scope ?

    En fait, {{count}} est un moniteur, ce qui équivaut à appeler $scope.$watch('count',watchFunc)
    Angular détecte si $scope.count change à chaque fois qu'il est mis à jour et déclenche watchFunc
    une fois qu'il change. Spécifique à votre DOM, watchFunc met à jour textContent
    Quant à savoir quand angulaire sera mis à jour, après ng-click, ou $http.get ou entrée onblur,
    J'ai récemment lu Angular et je l'ai imité. Il y a un chapitre dans la base de code qui explique comment implémenter la liaison

    .

    répondre
    0
  • Annulerrépondre