代码之家  ›  专栏  ›  技术社区  ›  kisonay

AngularJS-当指令更改服务中的数据时未更新视图

  •  1
  • kisonay  · 技术社区  · 6 年前

    我正在使用一个指令来与服务交互,并且在显示最新数据的视图中遇到了一些问题。

    我设置了以下示例您可以看到,当控制器与服务交互时,视图将使用最新数据更新如果单击指令链接,可以在控制台中看到数据已更改,但视图未使用该数据更新。

    http://jsfiddle.net/kisonay/pv8towqc/

    我错过了什么?

    JavaScript 以下内容:

    var app = angular.module('myApp', []);
    
    app.factory('Service', function() {
      var Service = {};
      Service.data = {};
      Service.data.active = false;
      Service.data.one = {};
      Service.data.many = [];
      Service.changeActive = function(state) {
        state = state || false;
        Service.data.active = state;
      };
      Service.setOne = function(one) {
        Service.data.one = one;
      };
      Service.setMany = function(many) {
        Service.data.many = many;
      };
      return Service;
    });
    
    app.directive('launcher', function(Service) {
      return {
        restrict: "A",
        link: function(scope, elem, attrs) {
          elem.bind('click', function(event) {
            if (Service.data.active) {
              Service.changeActive(false);
            } else {
              Service.changeActive(true);
            }
            console.log(Service.data); // shows data changed
          });
        }
      };
    });
    
    function Ctrl1($scope, Service) {
      $scope.ServiceData = Service.data;
    }
    
    function Ctrl2($scope, Service) {
      $scope.active = function() {
        Service.changeActive(true);
      };
      $scope.inactive = function() {
        Service.changeActive(false);
      };
    }
    

    HTML格式

    <div ng-controller="Ctrl1">
      {{ServiceData}}
    </div>
    
    <hr />
    
    <div ng-controller="Ctrl2">
      Directive: <a href="#" launcher>Change</a>
      <hr /> Controller:
    
      <button ng-click="active()">
        Active
        </button>
      <button ng-click="inactive()">
        Inactive
        </button>
    </div>
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   JB Nizet    6 年前

    你的事件监听器执行,但是Angular对它一无所知,所以它不知道它必须检测变化。

    添加 scope.$apply(); 在click listener的evn上,它将按预期工作。

        2
  •  0
  •   sawbeanraz    6 年前
    app.directive('launcher', function(Service) {
      return {
        restrict: "A",
        link: function(scope, elem, attrs) {
          elem.bind('click', function(event) {
            scope.$apply(function() {
              if (Service.data.active) {
                Service.changeActive(false);
              } else {
                Service.changeActive(true);
              }
            });
          });
        }
      };
    });