Javascript 如何更新列表的ng repeat视图?

Javascript 如何更新列表的ng repeat视图?,javascript,angularjs,angularjs-ng-repeat,Javascript,Angularjs,Angularjs Ng Repeat,使用ng repeat显示列表。但是如果我从DOM外部更改列表(在本例中,使用计时器),列表视图不会得到更新 要解决此问题,我必须做些什么?因为您正在从Angular外部调用setTimeout(fn),所以摘要循环不知道变量已更新 尝试使用Angular的$timeout服务,这样当函数运行时,Angular将知道应用摘要循环 编辑:示例使用$scope.$apply(),以防未使用$timeout。 评论中写道:“是的,如果(!$scope.$$phase)$scope.$apply(),

使用
ng repeat
显示列表。但是如果我从DOM外部更改列表(在本例中,使用计时器),列表视图不会得到更新


要解决此问题,我必须做些什么?

因为您正在从Angular外部调用setTimeout(fn),所以摘要循环不知道变量已更新

尝试使用Angular的
$timeout
服务,这样当函数运行时,Angular将知道应用摘要循环

编辑:示例使用
$scope.$apply()
,以防未使用
$timeout

评论中写道:“是的,如果(!$scope.$$phase)$scope.$apply(),您可以运行
if(!$scope.$$phase)$scope。如果您只是消化本地范围,还可以运行
$scope.$digest
。”

控制器内的代码示例:

$scope.lines = lines;
setTimeout(function() {
    lines.push({text: 'new text'});
    console.log('Line added: ' + lines.length);
    if ( !$scope.$$phase ) $scope.$apply();
}, 1000);

您正在角度范围之外进行更改,因此数据更改后视图不会更新。您需要添加一个$watch来查看范围外所做的更改。然而,这可能不是依赖于更复杂植入的最佳方法,但在您的简单示例中,它会起作用。@JaredReeves您能详细说明一下吗?似乎不起作用。您提到您是从服务器端获取数据的,在如何正确实施/修复此问题方面,您是如何准确地获取数据的,因为这会产生影响。我将使用一个服务获取数据,然后将该服务注入控制器。@JaredReeves这可能是服务器在客户端无法预见的时间推送。如果您可以用更详细的示例更新您的问题,将更容易帮助您正确实现当我不使用计时器时的任何解决方案,但是服务器端(或其他类型的)更新?是的,如果(!$scope.$$phase)$scope.$apply()
,您可以运行
。如果您只是消化本地范围,那么还有
$scope.$digest
。福克:未来安全吗?我听说应该避免使用
$
变量?另外,你能更新你的答案吗,这样我就可以把它标记为正确的?您是否可以随时将其与使用
$watch
进行快速比较?这里有一个fork,每次更改
$scope.lines
变量时都会记录该fork:。如果您正在从控制器外部更新
$scope
,这可能是一种“异味”。从理论上讲,您可以将其作为参数传递给函数,将其分配给窗口范围,等等,但这些都是不好的做法,我建议不要这样做。是的,避免操纵
$
变量,但是您可以检查所有您想要的变量。通常您会执行类似
$http.post(ajax\u url,ajax\u数据)的操作。然后(function(){$scope.lines=['new',array'];})一旦Angular完成回调函数,它就知道应用摘要循环。这一切都发生在你的控制器内。例如,假设您更新了指令中的数据,然后您想将其应用于控制器,您必须查看诸如
范围、$parent
、隔离与共享范围等内容,在这个特定用例之外还有很多问题。