亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

AngularJS:在調用$Scope.$Apply()時防止已經在進行的錯誤$摘要

AngularJS:在調用$Scope.$Apply()時防止已經在進行的錯誤$摘要

慕虎7371278 2019-06-06 15:38:08
AngularJS:在調用$Scope.$Apply()時防止已經在進行的錯誤$摘要我發現我需要手動更新我的頁面到我的范圍越來越多,因為構建一個應用程序的角度。我知道的唯一辦法就是打電話$apply()我的控制器和指令的范圍。這樣做的問題是,它不斷向控制臺拋出一個錯誤,該控制臺讀取:錯誤:美元摘要已經在進行中有沒有人知道如何避免這一錯誤,或者以不同的方式實現相同的目標?
查看完整描述

3 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

不要使用這種模式-這將導致的錯誤多于解決的錯誤。即使你認為它能解決一些問題,它卻沒有。

您可以檢查$digest已經在通過檢查$scope.$$phase.

if(!$scope.$$phase) {
  //$digest or $apply}

$scope.$$phase會回來"$digest""$apply"如果$digest$apply正在進行中。我相信這些州之間的區別在于$digest將處理當前范圍的表及其子表,以及$apply將處理所有范圍的觀察者。

@dnc 253的觀點,如果你發現自己在打電話$digest$apply經常,你可能做錯了。當需要更新范圍的狀態時,我通常會發現需要消化,因為DOM事件是在角范圍之外觸發的。例如,當Twitter引導模式被隱藏時。有時,DOM事件會在$digest正在進行中,有時沒有。所以我才用這張支票。

如果有人知道的話,我很想知道更好的方法。


來自評論:by@anddoutoi

angular.js反模式

  1. 別這樣

    if (!$scope.$$phase) $scope.$apply()

    ,這意味著

    $scope.$apply()

    在呼叫堆棧中不夠高。


查看完整回答
反對 回復 2019-06-06
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

最近一次與角質人的討論就是關于這個話題的:由于將來的防偽原因,您不應該使用$$phase

當按下“正確”的方法來做這件事時,答案是當前的。

$timeout(function() {
  // anything you want can go here and will safely be run on the next digest.})

最近,我在編寫棱角服務來包裝Facebook、Google和TwitterAPI時遇到了這種情況,這些API在不同程度上都有回調。

下面是服務內部的一個示例。(為了簡潔起見,服務的其余部分-設置變量、注入$timeout等等)。-已經停止了。)

window.gapi.client.load('oauth2', 'v2', function() {
    var request = window.gapi.client.oauth2.userinfo.get();
    request.execute(function(response) {
        // This happens outside of angular land, so wrap it in a timeout 
        // with an implied apply and blammo, we're in action.
        $timeout(function() {
            if(typeof(response['error']) !== 'undefined'){
                // If the google api sent us an error, reject the promise.
                deferred.reject(response);
            }else{
                // Resolve the promise with the whole response if ok.
                deferred.resolve(response);
            }
        });
    });});

注意,$timeout的延遲參數是可選的,如果未設置,默認為0($超時值打電話$Browser.推遲哪一個如果沒有設置延遲,默認為0)

有點不直觀,但這是男人寫角度的答案,所以這對我來說已經足夠好了!


查看完整回答
反對 回復 2019-06-06
?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

摘要周期是一個同步調用。在完成之前,它不會將控制權讓給瀏覽器的事件循環。有幾種方法可以解決這個問題。處理這一問題的最簡單方法是使用內置的$timeout,第二種方法是如果使用下劃線或存檔(應該是這樣),則調用以下命令:

$timeout(function(){
    //any code in here will automatically have an apply run afterwards});

或者如果你有房客:

_.defer(function(){$scope.$apply();});

我們嘗試了幾種解決方法,我們討厭將$rootScope注入到所有控制器、指令甚至一些工廠中。因此,到目前為止,$timeout和_.delayer一直是我們最喜歡的。這些方法成功地告訴角直到下一個動畫循環,這將保證當前范圍。$Apply已經結束。


查看完整回答
反對 回復 2019-06-06
  • 3 回答
  • 0 關注
  • 1533 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號