Angular $ watch的奇怪行为

帕斯卡

今天,我在使用$ watch的AngularJS中遇到了一些非常奇怪的行为。我将代码简化为以下示例:

https://jsfiddle.net/yLeLuard/

此示例包含一个将跟踪state变量的服务。伪指令用于将click事件绑定到state通过服务更改变量的DOM

此示例中有两个问题:

  1. 第一个关闭按钮(具有ng-click属性)仅在第二次单击时更改状态
  2. 没有ng-click的两个按钮根本不会改变状态

main.html

<div ng-controller="main">
  State: {{ api.isOpen | json }}
  <div ng-click="" open>
    <button>Open - Working fine</button>
  </div>
  <div ng-click="" close>
    <button>Close - Works, but only on second click</button>
  </div>
  <div open>
    <button>Open - Not Working</button>
  </div>
  <div close>
    <button>Close - Not Working</button>
  </div>
</div>

main.js

var myApp = angular.module('myApp', []);

myApp.controller('main', ['$scope', 'state', function($scope, state) {
  $scope.api = state;

  $scope.api.isOpen = false;

  $scope.$watch('api.isOpen', function() {
    console.log('state has changed');
  });
}]);

myApp.directive('open', ['state', function(state) {
  return {
    restrict: 'A',
    scope: {},
    replace: true,
    template: '<button>Open</button>',
    link: function(scope, element) {
      element.on('click', function() {
        state.isOpen = true;
      });
    }
  };
}]);


myApp.directive('close', ['state', function(state) {
  return {
    restrict: 'A',
    scope: {},
    replace: true,
    template: '<button>Close</button>',
    link: function(scope, element) {
      element.on('click', function() {
        state.isOpen = false;
      });
    }
  };
}]);

myApp.service('state', function() {
  return {
    isOpen: null
  };
});
弗洛里邦

那是因为您在上使用了本机事件侦听器click此事件是异步的,不在Angular摘要周期内,因此您需要手动摘要范围。

myApp.directive('open', ['state', function(state) {
  return {
    restrict: 'A',
    scope: {},
    link: function(scope, element) {
      element.on('click', function() {
        scope.$apply(function() {
          state.isOpen = true;
        });
      });
    }
  };
}]);

固定小提琴:https : //jsfiddle.net/7h95ct1y/

我建议直接在ng-click中更改状态: ng-click="api.isOpen = true"

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

嵌套Angular指令的奇怪行为

来自分类Dev

带插值的Angular 10奇怪行为

来自分类Dev

奇怪的行为:Angular Js - Spring Rest Service

来自分类Dev

Angular2:angular-http标头的行为很奇怪

来自分类Dev

Angular ng-include奇怪的行为-导致URL地址更改

来自分类Dev

array.splice在Angular Js指令中显示奇怪的行为

来自分类Dev

Angular ngRoute / UI-Router奇怪的重定向行为

来自分类Dev

Angular UI引导轮播中的奇怪滑动行为

来自分类Dev

带有* ngFor的Angular2奇怪的表单行为

来自分类Dev

Angular2 站点在错误后显示奇怪的行为

来自分类Dev

Angular.js奇怪的行为-必须单击两次按钮才能显示下拉菜单

来自分类Dev

IIS 8.x虚拟目录上的Angular应用具有奇怪的URL行为

来自分类Dev

在fix.detectChanges()之后更改Angular中的输入属性会导致奇怪的行为

来自分类Dev

奇怪的行为

来自分类Dev

奇怪的行为

来自分类Dev

奇怪的行为

来自分类Dev

预测行为的奇怪行为

来自分类Dev

AngularJS $ watch控制器初始化期间的奇怪行为

来自分类Dev

在单个Redis连接上交织Watch Multi / exec。预期或奇怪的行为?

来自分类Dev

Angular 2 - 极其奇怪的行为 - 一个选项卡中出现的变化与另一个

来自分类Dev

Angular何时清除$ watch?

来自分类Dev

Angular JS $ watch vs $ on

来自分类Dev

奇怪的addEventListener行为

来自分类Dev

MATLAB subs():奇怪的行为

来自分类Dev

右移位的奇怪行为

来自分类Dev

奇怪的约束行为

来自分类Dev

IronPython奇怪的行为

来自分类Dev

Java重载的奇怪行为

来自分类Dev

htaccess问题-奇怪的[或]行为