2014-07-20 35 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