2013-07-15 49 views
9

問題是,我使用ui-router,我有兩個視圖,一個是一種工具欄,另一個是內容與表單。Angular.js - 表單驗證是否發射任何事件?

現在我想在工具欄中有一個保存按鈕,如果表格不是$valid,那麼它將被禁用。但是,這兩個是完全不同範圍,它是這樣的:

  • rootScope
    • 工具欄範圍
    • 含量範圍(與form.$valid

所以我想我會通過收聽表單發出的某種有效事件來處理它。

根據什麼Vojta開發說here這些事件應該存在,但我無法找到他們的任何地方指定..看着this我沒有看到任何事件..

我大概可以做

$scope.$watch('form.$valid', function(newVal, oldVal) { 
    $scope.$emit('validityChange', {'form':newVal}); 
}); 

但感覺像使用事件,而不是這將是更好的

或者我應該嘗試完全不同的東西?請注意,我無法將工具欄的ui-view放在內容的ui-view中,並且根據this,兩個ui-視圖根本無法擁有相同的範圍。

回答

0

直接回答問題: 我不知道angularjs中的本地表單事件。但是,如您所知,您可以輕鬆創建自己的活動,這可以解決您的問題。

但是,這裏是我的建議: 你正試圖讓兩個控制器互相溝通。使用事件可能是錯誤的方法。事件應該真正用於應用程序範圍的通知,如身份驗證。

您可以重構表單並將按鈕提交到兩個共享相同控制器的指令中。雖然他們不會共享範圍,但他們將共享可用於通信的控制器對象。我會這樣做。

另一種方法是將兩個範圍嵌套在一起。將表單代碼移到更高級別的控制器中。就像這樣:

  • rootScope
    • 這裏主要//你的表單代碼
      • 工具欄//提交按鈕訪問功能
      • 內容//形式訪問功能

希望有所幫助!

+0

此答案不是合適? –

0

假設您的視圖必須具有不同的狀態,並且兩者都位於相同的主控制器和主HTML頁面中,則可以使用它們的狀態名稱以及ng-if指定您的狀態。

可以說「內容」狀態是爲您的內容視圖。

包含您的工具欄上的HTML div標籤

現在,提條件的東西在你的保存按鈕場,與此類似,即

ng-if = $state.current.name === 'content' && 'nameOfYourForm'.$valid 

如果滿足此條件,間接意味着你的表格是有效的。

但是,你將不得不在run方法中寫這個,它應該和你的模塊聲明在同一個js文件中聲明。

angular.module('nameOfModule' , ['dependency1', ..]). run(run) 

然後在你的run方法,注入$ rootScope和$狀態,聲明和定義它像這樣:

function run(stateHandler, .. ,$rootScope, $state) { 
    $rootScope.$state = $state; 
} 
相關問題