Javascript AngularJS范围监视未触发

Javascript AngularJS范围监视未触发,javascript,jquery,html,angularjs,Javascript,Jquery,Html,Angularjs,我的作用域中有一个日期筛选字符串 $scope.myModel = {date:""}; 我还有一个jQuery日期选择器 在指令内更新此字符串的(使用) 根作用域日期得到正确更新,我可以成功地将其发送到服务器,但我想在日期更改时做一些事情。我的函数在页面初始化时被调用一次,然后就再也不会调用了 $scope.$watch("myModel.date", function(newVal, oldVal) { console.log("newVal: " + newVal + ' old

我的作用域中有一个日期筛选字符串

$scope.myModel = {date:""};
我还有一个jQuery日期选择器

在指令内更新此字符串的(使用)

根作用域日期得到正确更新,我可以成功地将其发送到服务器,但我想在日期更改时做一些事情。我的函数在页面初始化时被调用一次,然后就再也不会调用了

$scope.$watch("myModel.date", function(newVal, oldVal) {
  console.log("newVal: " + newVal + '  oldVal:' + oldVal);
  if (newVal == oldVal) {
    return;
  }
  // do something 
});

我做错了什么?

我在其他一些堆栈溢出帖子中读到,您可以通过scope.apply()强制检查您的作用域,但我摘要中的作用域与控制器中的作用域不同。这是可行的,但我对角度和消化的了解还不够,无法解释原因

elem.bind('change paste', function (blurEvent) {
          if (elem.data('date-value') != elem.val()) {
            console.log('value changed, old value is:' + elem.data('date-value') +'new value is: ' + elem.val());
            elem.data('date-value', elem.val());
            scope.dateValue = elem.val();
            if (!scope.$$phase) {scope.$apply();}
          }
        });
无论如何,这看起来太复杂了,在我完成选择之前,当我点击框时,元素绑定被触发。最后,我在jQuery datePicker参数的onClose上设置了一个函数调用

datePickerParams = {
    controlType     : "select",
    timeFormat      : "hh:mm TT",
    onClose         : function(dateText, inst) {
                          $scope.myModel.dateText = dateText;
                          // do stuff
                      }
};
然后把它传递给指令

.directive('datePicker', function ($timeout) {
  return {
    scope: {
      datetimePickerParams: "=",
    },
    link : function (scope, elem, attrs) {
      $timeout(function() {
        elem.datetimepicker(scope.datetimePickerParams)
      });
    },
  };
});

(也许是时候检查angular日期选择器了,远离jquery了。)

您是否尝试过使用true作为第三个参数调用$watch

$scope.$watch("myModel.date", function(newVal, oldVal) {
  console.log("newVal: " + newVal + '  oldVal:' + oldVal);
  if (newVal == oldVal) {
    return;
  }
  // do something 
}, true);
这将检查值相等,而不是参考相等

检查此处以了解第三个参数[objectEquality]的作用。基本上将其设置为true将导致=>“使用angular.equals比较对象相等,而不是比较引用相等。”

此外,观察布尔标志可能比观察对象更好。在更改“myModel.date”时切换布尔标志,并查看该标志。这将减少性能开销-检查对象比检查布尔标志要昂贵


希望这有帮助

在scope.dateValue=elem.val()之后的指令中添加scope.$apply;是的,我在其他许多“angularjs scope watch not working”线程中读到了这篇文章,但它对我来说不起作用。
$scope.$watch("myModel.date", function(newVal, oldVal) {
  console.log("newVal: " + newVal + '  oldVal:' + oldVal);
  if (newVal == oldVal) {
    return;
  }
  // do something 
}, true);