2013-05-05 67 views
1

我目前使用應用已經在進行錯誤

scope.onFocus = function(){ // change scope variables 
}; 

elem.bind('focus', function(){ 
    scope.$apply('onFocus()')}); 

綁定到一個指令的鏈接功能的焦點事件。

問題是如果我像這樣手動激發焦點事件:elem.focus()在說ng-click處理程序中,我將得到「應用正在進行中」錯誤。

是檢查是否適用一直被稱爲解決方法:if (! scope.$$phase)

是它被認爲是「Angularic」打電話申請前檢查?

任何其他優雅的解決方案?

更新:

這裏是我的解決方案:

由於scope.onFocus可以觸發外部事件(角以外),這反過來又可以叫$apply,你將有錯誤「已經在進行中適用」。訣竅是分別撥打$apply

element.bind('focus', function(){ 
    scope.onFocus(); 
    scope.$apply(); // don't wrap onFocus call in $apply 
}) 
+0

爲什麼要在ng-click中做elem.focus()?爲什麼不''onFocus()'? – joakimbl 2013-05-05 10:20:33

+0

cos不容易訪問scope.onFocus。一切都在角度上是如此孤立 – Lucas 2013-05-06 12:29:46

回答

0

您可以使用一個指令要做到這一點,如:

myapp.directive('onfocus', function() { 
     return { 
     restrict: 'A', 
     scope: { 
     onfocus:'=onfocus' 
      }, 
     link:function (scope, element, iAttrs, controller){ 
      element.bind('focus', function(event) { 
        scope.onfocus(); 
       }); 
     } 

      }; 

    }); 

視圖

<input type="text" onfocus="onFocus()" /> 

而且你的控制器

scope.onFocus = function(){ // change scope variables 
}; 
+0

感謝您的答案。看上去不錯。但我不想手動指定onfocus處理程序。它應該以編程方式完成。 – Lucas 2013-05-06 12:39:40

+0

我試過 var onFocus = $ parse('onFocus()'); element.bind('focus',function(){onFocus(scope);})但不起作用 – Lucas 2013-05-06 12:40:19

+0

你可以創建一個小提琴或plunker嗎? ;-)。 – timactive 2013-05-06 13:14:46

0

老實說,如果你是在比賽條件,最好的我可以建議我你需要以不應該發生的方式來組織代碼,如果代碼仍然存在,那麼代碼存在問題。 $$階段是Angular用於檢查當前摘要週期的當前狀態的內部實現。使用$$階段不是未來安全的,你應該避免使用它。

堆棧跟蹤對比賽條件非常有用。它實際上解釋了正在生產比賽的其他哪個週期正在運行。

複雜的情況下,像一個額外的API調用,它同時作爲異步和sycn(成爲緩存的同步原因),您應該嘗試處理它並使API以單一方式進行操作。

嘗試在約$超時/ $間隔詳細閱讀,$應用/ $消化和ngModel/ngModelController($渲染/ $ setViewValue)。還要仔細看看傳遞給$ timeout/$ interval service的第三個參數。這可能對您目前的情況非常有幫助。