2016-05-18 58 views
0

我有一個帶有動態許多子窗體的Angular窗體。提交後第一個表單不會被重置,並且每次提交時都會重置子表單。

如果用戶不重新加載頁面,我們可以多次使用這個整個表單。 因此,在驗證並提交之後,我不重置第一個表單,而是讓用戶再次單擊它,並且他可以添加一些其他子表單(如果沒有更改)。

驗證僅在用戶單擊提交時出現,因此範圍變量subFormSubmitted變爲true並且所需的錯誤仍然爲真。例如

subForm.salutation.$error.required && subFormSubmitted 

在第一頁上 - 一切工作正常。當我嘗試提交子表單時,無需輸入內容,就會顯示所需的驗證。

問題是,在他第一次提交表單後,他沒有改變第一個表單中的任何內容,並且他第二次接觸到動態表單,只需單擊submit,不輸入內容,模型沒有得到更新,也沒有顯示驗證,儘管範圍變量有正確的值。 變量

subForm.salutation.$error.required && subFormSubmitted 

計算結果爲真當我檢查它在webdeveloper。但是,當我關注輸入並輸入內容時,所需驗證立即出現在其他輸入中。另外,當我改變第一種形式的東西 - 然後輸入子表單時,當我按下提交時,驗證顯示正確。

所以我想,這可能是一個應用範圍的問題。

我後一些嘗試和錯誤做了什麼,我得到了有效的解決方案:

我加

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

當我按下提交被調用範圍功能。

這工作得很好,但是經過一番研究,我發現,這是一個反模式: Why is using if(!$scope.$$phase) $scope.$apply() an anti-pattern?

因此,有人可以幫助我,告訴我什麼是「正確」的方式來解決這個問題?

基本上我用ng-show = firstFormSubmitted來控制窗體的可見性。

$scope.addSubForm = function() { 
      $scope.firstFormSubmitted = true; 

我希望你能理解我的問題,遺憾的英語不好

+0

請爲您描述的情況提供[MCVE](http://stackoverflow.com/help/mcve),最好以小提琴/ plunk的形式提供。 – estus

回答

0

$scope.$apply$scope.$digest是指在異步運行(在最初的消化週期後)回調執行:AJAX請求,setTimeout/setInterval/setImmediate,非$q承諾,DOM事件監聽器等

這是角的工作作爲一個框架,在所有異步自動執行的內置插件($http$timeout,指令),並處理作業。精心策劃的第三方擴展可以做同樣的事情。

爲什麼!$scope.$$phase && $scope.$digest()可以被認爲是一個反的理由是,在井字形的應用程序開發人員如果摘要或不執行的代碼始終知道,所以這種檢查是多餘的。如果不是,這是應用程序設計中一些缺陷的指標。

相關問題