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);