angularJS element.on回调和范围。$ apply

时间:2013-12-12 23:46:11

标签: angularjs angularjs-directive jqlite angularjs-model

在这个例子中,我有一个带有附加指令的输入。该指令用于显示输入旁边的消息。还有另一个输入和一个添加消息的按钮。 显示某些消息后,使用附加指令关注输入应清除消息。 http://jsfiddle.net/viro/WBqxf/

所以我有一个带有隔离模型的指令,并且我试图在具有指令的元素成为焦点时更新模型。 看起来我必须在事件范围内包装事件回调。如果我想更新模型,则为$ apply:

element.on('focus',function(){
    scope.$apply(function(){
        console.log("focus !");
        scope.tstMsg=[];
    })
});

我想我必须将它包装在$ apply中,因为我正在使用jqlite事件回调,我猜它们在“外部”angularJS中运行,但我没有在文档中明确说明。

我做得对吗还是黑客攻击?

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

每当您使用第三方库并执行更改时,您需要通过调用$apply()来了解Angular。

正如@charlietfl所说,ng-focus更容易:

<强>的Controler

$scope.focus = function() {
    // Do something
}

<强> HTML

<input ng-model="inp" tst-msg="message" ng-focus="focus()" />

参见 jsFiddle

答案 1 :(得分:2)

范围。$ apply将导致运行$摘要,因此范围内的任何观察者都会检查更改并在适当的时候触发。因为正如你所说,你只是绑定到一个事件(在适当的时候只是addEventListener / attachEvent)来做范围。$ apply在这个上下文中是有效的。