Angular链接功能是否会触发更改事件?

时间:2016-02-29 20:02:30

标签: javascript jquery angularjs angularjs-directive

我有一个带有link函数的Angular指令,在其中我正在实例化一个jQuery插件,如https://plnkr.co/edit/58nOhypt6FRdI4At5jwu所示。

问题在于指令实例化的每一刻都会触发change事件,并且我有一个函数监听那些change事件(当用户触发它们时)。

link函数是否始终触发change?或者它是jQuery插件吗?我收到一个值(来自Ajax请求)并将其放入输入中。插件不应该“触摸”它,它应该只是实例化datepicker。

另一点是:让我们考虑插件改变输入。这是程序化更改,ng-change指令不会监听这些程序化更改,对吗?

1 个答案:

答案 0 :(得分:1)

不,link函数不会 trigger更改事件。此代码触发了更改事件:

$datepicker = $(element).datepicker({
        format: "dd/mm/yyyy",
        startDate: 'today',
        language: 'pt-BR',
        autoclose: true,
        todayHighlight: true,
        forceParse: false
      });
   $datepicker.datepicker('setDate', date);

实际上更改了模型$scope.date,这就是调用ng-change的原因!

将回答这个问题:

  

另一点是:让我们考虑插件改变输入。   这是一个程序化的改变,而ng-change指令则没有   听听这些程序化的变化吧?

换句话说:

  

基本上,您正在更改链接期间输入的格式   事件

您可以通过告知edit()函数何时发生真正的更改,或者只是简单地执行watch并且不使用ngChange指令来解决此问题。

$scope.$watch('date', function(newValue, oldValue) {

    if(newValue!=oldValue&&newValue!='25/12/2018'){
      console.log(newValue);
      console.log(oldValue);
      $scope.changed = true;
    }
  });

https://plnkr.co/edit/Yq32mq7fm7niy6eXhrDL?p=preview

在我看来,如果可以的话。 我不会在项目中使用任何jQuery

你应该使用 Angular ui-datepicker https://angular-ui.github.io/bootstrap/#/datepicker

关于角色 jQuery reference

  

DOM Manipulation停止尝试使用jQuery修改DOM   控制器。真。这包括添加元素,删除元素,   检索其内容,显示和隐藏它们。使用内置   指令,或在必要时编写您自己的DOM   操纵。请参阅下文有关复制功能的信息。

     

如果您正在努力摆脱这种习惯,请考虑从中删除jQuery   你的应用。真。 Angular拥有$ http服务且功能强大   使它几乎总是不必要的指令。 Angular的捆绑   jQLite有一些最常用的写作功能   Angular指令,特别是对事件的绑定。