I have this simple scenario:

值由jQuery的val()方法更改的输入元素.

我正在try 使用jQuery设置的值更新Angular 模型.我试着写一条简单的指令,但它不是我想要的.

以下是指令:

var myApp = angular.module('myApp', []);
myApp.directive('testChange', function() {
    return function(scope, element, attrs) {        
        element.bind('change', function() {
            console.log('value changed');
        })
    }
})

这是jQuery部分:

$(function(){
    $('button').click(function(){
        $('input').val('xxx');
    })
})

和html:

<div ng-app="myApp">
    <div ng-controller="MyCtrl">
        <input test-change ng-model="foo" />
        <span>{{foo}}</span>
    </div>
</div>

<button>clickme</button>

Here is the fiddle with my try:
http://jsfiddle.net/U3pVM/743/

有人能给我指个方向吗?

推荐答案

ngModel监听"输入"事件,所以要"修复"代码,需要在设置值后触发该事件:

$('button').click(function(){
    var input = $('input');
    input.val('xxx');
    input.trigger('input'); // Use for Chrome/Firefox/Edge
    input.trigger('change'); // Use for Chrome/Firefox/Edge + IE11
});

对于这种特殊行为的解释,请查看我刚才给出的答案:"How does AngularJS internally catch events like 'onclick', 'onchange'?"


但不幸的是,这不是你唯一的问题.正如其他帖子 comments 所指出的,以jQuery为中心的方法是完全错误的.欲了解更多信息,请查看此帖子:How do I “think in AngularJS” if I have a jQuery background?).

Jquery相关问答推荐

无法通过单击从元素获取数据

使用 howler.js 中的变量播放多种声音

JSLint 错误:将调用移动到包含函数的括号中

模糊事件阻止点击事件工作?

如何在 bootstrap 模式关闭并重新打开时重置 bootstrap 模式?

在 jQuery 中,我想删除 div 中的所有 HTML

如何使用 jQuery 重置 Select 元素

jQuery 插入 div 作为某个索引

jquery-ui datepicker更改z-index

使用jquery设置di​​v标签的值

使用 jQuery 验证插件自定义日期格式

如何阻止 Chrome 进入调试模式?

jQuery:如何从 $.ajax.error 方法中获取 HTTP 状态代码?

使用 jQuery DataTables 时禁用第一列的自动排序

触发下拉更改事件

如何从所有元素jquery中删除类

在 jQuery 中 Select 后代元素的最快方法是什么?

如何以编程方式触发 ngClick

粘性侧边栏:向下滚动时固定在底部,向上滚动时固定在顶部

.success() 和 .complete() 之间的区别?