2014-02-16 49 views
2

在我編寫我的第一個單頁Angular應用程序時,我面臨的挑戰是在隨後調用數據服務時使用重複數據填充$scope.MyModel

$scope.MyModel第一次是空的,並通過撥打數據服務進行填充。

這發生在響應菜單"show ..."被選中。在此之後,用戶可以選擇其他菜單項並查看其他事物,然後返回以選擇相同的菜單項"show..."

一旦再次選擇此菜單項,它會觸發對數據服務的另一個調用,然後$scope.MyModel會附加上來自該附加服務調用的重複數據集。

顯然,在一個單一頁面的應用程序中,整點並不是做任何不必要的服務調用。

如果給定的模型已經填充了數據,檢查和防止這種附加服務調用的標準方法是什麼?

+0

請或不使用簽名或標語在您的帖子](http://stackoverflow.com/faq#signatures)。 – meagar

+0

取決於$ scope.MyModel的類型。如果它是一個數組,它應該像檢查服務回調函數中的'$ scope.MyModel.length'一樣簡單,假定服務在每次調用時返回相同的數據。 – godfrzero

+0

爲什麼不只在頁面加載時填充它? – Shomz

回答

1

顯然,在一個單頁的應用程序,整點不作任何 不必要的服務電話。

我不認爲這是強制性的,它應該取決於需求和你想做什麼。在同時由多個用戶訪問的應用程序中,這創建了一個更好的應用程序,其中使用來自服務器的最新數據刷新視圖 =>降低併發問題的可能性,如查看過期數據,更新過時數據這通常是通過向數據應用版本並在嘗試更新陳舊數據(該版本的版本低於服務器上的版本)時導致服務器發生錯誤來完成的。

如果您決定檢查是否爲空並且不想使用最新數據進行刷新。你可以像我們通常使用普通的javascript那樣來完成它。 @Hasib Hasan Arnab的回答是一個解決方案的例子。

如果期望值$scope.MyModel是一個數組。你可以嘗試:

if (Array.isArray($scope.MyModel)){ 
} 
else{ 
} 

一個填充工具不支持的瀏覽器:

if(!Array.isArray) { 
    Array.isArray = function (vArg) { 
    var isArray; 

    isArray = vArg instanceof Array; 

    return isArray; 
    }; 
} 

Array.isArray引用。

2

只是if..else..

if ($scope.MyModel) { 
    // items have value 
} else { 
    // items is still null 
} 
+0

如果他已經定義了'$ scope.MyModel = []'或其他更早的東西,這是行不通的。你不覺得根據它的類型檢查它是否存在會更好嗎? – godfrzero

+0

你是對的。但他的問題標題是檢查他的對象空或不! –

+0

我同意在我的情況下,始終從服務器加載新數據更有意義,因爲其他用戶可能會添加新記錄。目前,我無法妥善處理回調結果的重新初始化,但我將在單獨的問題中發佈。感謝所有回答的人! –

2

既然你提到API調用是爲了響應與菜單的交互而發生的,我假設返回的數據是一個數組,所以如果我錯了,請糾正我的錯誤。

雖然這裏有兩種可能性:API返回的數據是動態的,可以在隨後的調用中更改,或者響應數據對於每個調用都是相同的。根據您正在處理的情況下,你可以嘗試以下之一:

相同的數據

$scope.MyModel = []; 

// Later on, in response to user interaction 
if(!$scope.MyModel.length) { 
    // We only make the API call if $scope.MyModel isn't already populated 
} 

動態數據

// We want to replace the data in $scope.MyModel each time now 
// So assuming your service parses the data to an array: 

// In response to user interaction 
SomeService.query(function(r) { 
    $scope.MyModel = [].concat(r.MyData) 
}); 
+0

如果我們聲明'$ scope.MyModel = [];'我們如何區分空(未加載)和加載,但是「沒有行」? –

+0

@KhanhTO * no rows * case是一個邊緣案例。因爲他正在談論靜態菜單,所以我猜測空菜單項的可能性很可能是0。但是,如果我在應用程序中遇到空模型,我寧願確保它仍然是空的,而不是錯過更新的數據。 – godfrzero