2014-07-20 36 views
0

我有一個大的我用一個按鈕導航到的項目列表。如果我立即加載列表控制器的數據,那麼在你看到頁面發生任何改變之前,角度會產生一個滯後時間。如果我在列表控制器中等待一段時間,等待50ms,則屏幕會立即變化,並且按鈕感覺響應更快。等待模板在動作之前被渲染?

我的問題是,什麼是「正確」的方式來做到這一點,因爲我非常確定setTimeout在這裏是一個巨大的黑客攻擊。

編輯與Plunkr:http://plnkr.co/edit/VqEiiAFZfV1hoXadw0vf?p=preview

此外,從plunkr一些代碼,因爲堆棧溢出要求是出於某些原因:

Test.controller('ListController', function($scope) { 
    var arr = []; 
    for (var i=0; i<5000; i++) { 
    arr[i] = i; 
    } 
    $scope.list = arr 
}); 

Test.controller('ListThatWaitsController', function($scope) { 
    var arr = []; 
    for (var i=0; i<5000; i++) { 
    arr[i] = i; 
    } 
    setTimeout(function() { 
    $scope.list = arr; 
    $scope.$apply() 
    }, 10); 
}); 
+0

在你看到頁面有任何改變之前,你的意思是什麼?)你可以發佈一個運動員嗎?這種行爲對我來說似乎不對。 – pixelbits

+0

很難看出延遲50ms是否會造成明顯的視覺差異 – charlietfl

+0

延遲不是造成差異的原因。區別在於按下按鈕後是否立即發生,或者實際上是否已準備好顯示。 – Joren

回答

0

使用你的路線resolve屬性(假設你使用$ routeProvider)

$routeProvider.when('/myroute', { 
    templateUrl: 'view/partial.html', 
    resolve: { 
    listData: ['service', function (service) { 
     return service.getList(); // Returns a promise that resolves with list 
    }] 
    } 
}); 

這種方式在任何控制器管理您的$路線,您可以注入listData它是威爾我是你想要的數組,但是$route在數據準備好之前不會解析。

+0

這聽起來像我所需要的完全相反。在數據可用/呈現之前,我需要解決路由更改,並更改模板。在註冊更改之前等待數據會使按鈕無法響應。 – Joren