2013-12-12 41 views
6

在這個例子中,我有一個帶有附加指令的輸入。該指令旨在顯示輸入旁邊的消息。還有另外一個輸入和一個按鈕來添加消息。 一旦顯示了一些消息,關注帶有附加指令的輸入應清除消息。 http://jsfiddle.net/viro/WBqxf/

所以我有一個指令與孤立的模型,我試圖更新模型時,具有該指令的元素進入焦點。 好像我必須包裝範圍事件回調$適用,如果我要更新模型:

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

我想我必須把它包在$適用,因爲我使用的是jqlite事件回調和我猜測他們運行「外部」angularJS,但我沒有發現它在文檔中明確指出。

我是對的還是黑客?

有沒有更好的方法來做到這一點?

+0

使用'ng-focus'並保存自己爲extrenal事件處理程序編寫的額外代碼http://docs.angularjs.org/api/ng.directive:ngFocus – charlietfl

+0

但是對於每個有指令的元素,我都需要相同的行爲無論在哪個控制器中,該元素都是焦點。有了ngFocus,我會讓每個元素都有一個函數來重置消息數組,如果它可以通過指令自動執行,那是很乏味的,不是嗎? –

回答

2

範圍$ apply將導致運行$ digest,因此範圍上的任何觀察者都將檢查更改並在適當的時候觸發。既然你說你只是綁定到一個事件(就像addEventListener/attachEvent適當的情況下一樣),在這個上下文中$ apply是有效的。

+0

那麼這意味着從element.on綁定的回調不是「angularJS aware」?我對此一無所知。 –

+0

是的,因爲它只是使用jqLit​​e或jQuery(如果包含),它不在角碼的上下文中。像$ http和$ timeout這樣的服務自動具有範圍$ apply call – shaunhusain

+0

所以,就像$ timeout而不是setTimeout;有什麼應該用來代替element.on嗎? –

3

每當您使用第三方庫並執行更改時,您需要通過致電$apply()讓Angular知道。

由於@charlietfl提到NG對焦更容易:

的Controler

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

HTML

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

jsFiddle

+0

由於某種原因,當我沒有申請$的時候,這是行不通的。我必須檢查。 ng-focus對我來說不是解決方案,因爲我希望指令是自給自足的。 我不想編寫一個函數來重置每個控制器的消息,在這個控制器中我有一個附帶指令的輸入。 –

+0

我更新了jsFiddle(刪除了$ apply())並添加了ng-focus。看一看。我會困惑,如果它只適用於我:) –

+1

我看了一下。確實有效。但是如果你刪除了ng-focus,它不會。你的例子幫助我理解了一些東西:ng-focus被angularJS處理,它在焦點上做了一個$ digest週期,所以在這種情況下,我不需要在事件回調中做到這一點。如果我想擺脫ng焦點,我需要$ apply。 –