2016-07-12 117 views
0

如果表達式匹配regex,我將self.display的值更改爲true。我已將此邏輯寫入$scope.$apply()塊,但當if塊被觸發時,我得到Digest already in progress錯誤。根據控制器中的更新值查看未更新

局部視圖模板 -

<form ng-controller="termsCtrl as terms"> 
    <div ng-show="terms.display"> 
     <input type="checkbox"> 
     <label> Accept </label> 
    </div> 
</form> 

控制器 -

if (self.regex.test(self.current)) { 
    $scope.$apply(function() { 
     self.display = true; 
    }); 
} else { 
    self.display = false; 
} 

上述代碼工作。當self.display爲真時,它會在form內正確顯示div,但我得到$digest already in progress錯誤。

我曾嘗試以下爲止,

1)

$scope.$watch('self.display', function() { 
    console.debug(self.display); 
}) 

2)

if(!$scope.$$phase) { 
    $scope.$apply(); 
} 

3)

$timeout(function(){ 
    self.display = true; 
}); 

上述技術不產生任何錯誤,但永遠不會顯示在form內的。

+0

請問你$範圍是什麼樣子?你對範圍有任何價值嗎? –

+0

,爲什麼你不想在'$ scope'上設置'display'的值,這樣可以爲你處理剩下的問題? –

回答

0

您只需要使用$ scope。$ apply()當您在外部執行角度控制器的範圍時。例如,如果您使用的是JQuery或純javascript的事件來觸發回調,那麼您可以在該回調中使用$ apply()。

沒有看到所有的代碼,這是很難說的問題是什麼,但我最初的想法是,你應該如果您使用的是可以用的,而不是「self.display」

+0

我正在使用'controllerAs'語法,因爲您可能已經想通了。這就是爲什麼我不想使用'$ scope'。我相信有一個更好的方式來實現這個,而不是使用'$ scope'。 – Aaron

0

$ scope.display指令,您需要使用bindToController選項,以便角度監視您的控制器實例上的值。否則,如果你只是用一個簡單的控制器,只是想用controllerAs語法,你必須手動設置表:

的JavaScript

angular.module("app", []) 
.controller('termsCtrl', function ($scope) { 
    this.display = true; 

    $scope.$watch(angular.bind(this, function() { 
    return this.display; 
    }), function (newVal, oldVal) { 
    // now we will pickup changes to newVal and oldVal 
    if (newVal !== oldVal) { 
     console.log(newVal, oldVal); 
    } 
    }); 
}); 
+0

我正在使用'controllerAs'語法,因爲你可能已經想通了。這就是爲什麼我不想使用'$ scope'。如果你不熟悉這個概念,這裏是一個很好的資源 - http://codetunnel.io/angularjs-controller-as-or-scope/ – Aaron

+0

我更新了我的答案,看看是否有道理。此外,如果您在此處放置更多相關的控制器部件,也會有所幫助。 –