Javascript ng模型不会触发更改事件
我正在使用的框架(jQuery Mobile)侦听textareas的更改事件以更改标记。这是框架代码,所以我不能修改它并包含正确的AngularJS函数 我通过ng模型将textarea绑定到范围变量。当作用域变量发生变化时(由于绑定了textarea内容),不会触发javascript更改事件。但是,如果没有更改事件,jQuery Mobile将无法更改标记 是否有一种内置方法可以让Angular在不编写指令的情况下触发更改事件?如果我使用指令或ng更改,我必须将相应的代码添加到textarea元素的每次出现 我正在尝试做的简短示例(也可通过以下方式获得):Javascript ng模型不会触发更改事件,javascript,angularjs,angular-ngmodel,Javascript,Angularjs,Angular Ngmodel,我正在使用的框架(jQuery Mobile)侦听textareas的更改事件以更改标记。这是框架代码,所以我不能修改它并包含正确的AngularJS函数 我通过ng模型将textarea绑定到范围变量。当作用域变量发生变化时(由于绑定了textarea内容),不会触发javascript更改事件。但是,如果没有更改事件,jQuery Mobile将无法更改标记 是否有一种内置方法可以让Angular在不编写指令的情况下触发更改事件?如果我使用指令或ng更改,我必须将相应的代码添加到textar
你为什么不用零钱呢
<div ng-app="app" ng-controller="Controller">
<textarea ng-model="textValue" ng-change="changed()"></textarea>
</div>
addEventListener是本机的,不是jquery。此外,ng模型会覆盖更改事件,特别是当更改事件是本机事件时
如果您想使用ngModel并监听更改事件,请使用:(小心:此指令需要ngModel)您可以覆盖ngModel
手动触发更改事件:
addEventListener是本机的,不是jquery。另外,ng模型会覆盖更改事件,特别是如果更改事件是本机的,并且不是由angular处理的。不确定您想做什么。有一点主题,但我可以提供一些建议。如果可能的话,我们不应该将jquerymobile和AngularJS结合起来,因为它们不能很好地结合在一起。根据经验,我认为要实现这一点,您会遇到很多麻烦。项目约束要求将JQM和AngularJS结合起来,到目前为止,这两种方法都非常有效。我只是在寻找一些“神奇”的开关,它可以实现更改事件的传播。此开关似乎不存在。我没有使用ng change,因为jQuery Mobile本身正在侦听更改事件(它是框架代码)。总是有“角度方式”的选项,但不幸的是jQuery Mobile没有这样做。但是点击事件不能有两个列表器吗?什么点击事件?更改事件的事件侦听器由jQuery Mobile绑定。更改事件处理程序由jQuery Mobile定义。我不能使用ng change,因为我不想绑定另一个更改处理程序,而是触发现有的更改处理程序。这就是为什么你的答案,虽然写得很好,但不适合这个问题。请检查你的控制台,我没有使用警报,这正是我想要的,因为它添加了正确的行为,而没有触及代码的所有部分。注意触发事件可能导致。。。这里有一个很小的问题:这是一个共享父范围的指令,我们正在添加一个手表。如果在该指令的HTML声明上有一个ngIf
,导致它被多次删除和重新添加,这不会造成手表泄漏吗?有什么办法可以处理吗?据我所知,没有指令描述符…@user2173353:我认为没有问题NgIf
()指令的优先级为:600,在“我们的”NgModel
之前运行(优先级:-1)。这意味着处理程序被附加到由ngIf
创建的作用域。如果ngIf
删除作用域,处理程序也会被销毁,因为它直接附加到作用域
<div ng-app="app" ng-controller="Controller">
<textarea ng-model="textValue" ng-change="changed()"></textarea>
</div>
module.controller("Controller", function ($scope) {
$scope.textValue = "Test";
var interval = $interval(function () {
$scope.textValue = $scope.textValue === "Test" ? "Hello World" : "Test";
},2000);
$scope.changed = function(){
alert('changed');
}
$scope.$on("$destroy", function(){
$interval.cancel(interval)
})
});
module.directive("ngModel",function(){
return {
restrict: 'A',
priority: -1, // give it lower priority than built-in ng-model
link: function(scope, element, attr) {
scope.$watch(attr.ngModel,function(value){
if (value){
element[0].onchange();
// element.trigger("change"); use this for jQuery
}
});
}
}
});