2013-08-19 19 views
4

我在angularJS應用程序中具有以下HTML部分。約會列表的< div/>標籤顯示約會列表。這個指令基本上只是一個表格。angularJS指令不立即遵守ng-show/ng-hide

<div ng-show="loading">Loading...</div> 
    <div ng-show="!loading && (appointments.length == 0)">No Appointments Found</div> 
    <div ng-hide="loading || (appointments.length == 0)">Test123</div> 
    <div ng-hide="loading || (appointments.length == 0)" appointment-list source="appointments" appointment-selected="appointmentSelected(appointment)"></div> 

然後,我在我的控制器中有以下內容。我正在設置一個加載變量,同時我還根據文本框中的文本過濾頁面上的約會。

$scope.$watch('selectedDate', function(newVal, oldVal) { 
    if (newVal) { 
      $scope.loading = true; 
      Appointment.query({year: newVal.getYear()+1900, month: newVal.getMonth()+1, day: newVal.getDate()}, function(data) { 
        $scope.allAppointments = data; 
        $scope.appointments = $scope.filterAppointments(); 
        $scope.loading = false; 
      }); 
    } 

    }); 

我的問題是,我的自定義指令的div隱藏不正確。該表應該與「Test123」字符串一起消失,而不是。當我從表中填入日期而沒有任何內容的日期時,「Test123」將替換爲加載(因爲它被隱藏,並顯示加載),但表格會一直保留到加載過程結束在這一點完成表將消失

有人可以解釋爲什麼延遲?爲什麼指令沒有像上面的div一樣響應?

編輯

這裏是一個plnkr這說明問題:http://plnkr.co/edit/khxQuaM6sxTx5RszvowX?p=preview

基本上按一下按鈕,在頂部加載兩個數據集。我有一個超時在那裏模擬服務器上的一些思考時間。每當你看到「Loading ...」時,不應該顯示appointmentList表格的div,因爲ng-hide會評估爲true,因爲加載是真實的,但是不會消失。

+0

您可以創建一個的jsfiddle? – zsong

+0

我已經添加了一個plnkr示例。 –

回答

5

您需要使用$parent才能訪問型號loading,因爲appointmentList指令創建了一個隔離範圍。對包含表格的最後一個div進行以下更改,您將獲得所需的效果。

<div ng-hide="$parent.loading || (appointments.length == 0)" appointment-list source="appointments" ... ></div> 

你並不需要使用$parentappointments,因爲你通過這個模型的指令。但是,添加$parent(如$parent.appointments.length == 0)並沒有什麼壞處,因爲您在父範圍中定義了appointments

順便說一句,你還應該設置appointments是在觀察者empty這樣

if (newVal) { 
    $scope.loading = true; 
    $scope.appointments = []; //add this 

,使病情appointments.length == 0有用。

+0

因此,在任何指令的元素中,該元素上的所有ng- *指令屬性都將引用在指令內創建的範圍?另一種方法是傳入一個變量,就像我在源代碼中隱藏/顯示這個變量一樣?對此的最佳實踐方法是什麼? –

+0

@jr。如果你在指令中指定了'scope',那麼它將創建一個獨立的'scope'。爲了證明它,刪除'scope:{ source:'=', appointmentSelected:'&' },那麼它應該做你想做的。由於不會創建任何獨立的作用域。是否有意義? – zsong

+0

是的,我現在明白了。因此,作爲指令的元素中的任何內容都將引用該新範圍。因此,澄清..我需要創建範圍並傳遞這些變量(就像我爲源代碼做的那樣),或者在元素屬性中引用$ parent範圍,或者根本不在該指令中創建範圍將只能訪問指令所在的任何範圍。 –

0

$scope.appointments被設置在與$scope.loading相同的刻度內嗎?

如果$scope.filterAppointments正在進行異步操作,您需要確保$scope.loading在該進程結束時設置爲false。

0

就我而言,在IE或Chrome中應用到ul> li元素時,angular並不想顯示/隱藏。將其更改爲div完美。我在角1.2.14。不知道這是否是一個錯誤,但它似乎是。