2014-01-18 89 views
0

成长我这样做:NG重复与对象不

<body> 
    <div ng-controller="PresentationCtrl"> 
     <a href="" ng-click="findAll()">Find</a> 
     <div> 
      <ul class ="unstyled"> 
       <li ng-repeat="p in presentations"> 
        <img ng-src="{{p}}" alt="presentation"> 
       </li> 
      </ul> 
     <div> 
    </div> 
</body> 

我有presentations内一个占位符元素时功能PresentationCtrl被打的设置。

findAll链接被击中,我一个元素添加到数组,像这样:$scope.presentations.push(sUrl);

但是,看我的页面时,列表不会增长。

请问ng-repeat只会发一次,还是什么?我可以强制它“刷新”并显示presentations中的当前值吗?

这里是我的控制器

console.log之前,我推元素放入数组被击中。并显示我期望的字符串。

function PresentationCtrl($scope){ 
$scope.presentations = ["http://angularjs.org/img/AngularJS-small.png"]; 

$scope.findAll = function(){ 
    var socket=null; 
    socket = io.connect('http://[server]:3000'); 
    socket.on('handshake',function(){ 
     socket.emit('viewAll',{tenant:'qa'}); 
     socket.on('returnAll',function(back){ 
      for(i=0;i<back.length;i++){ 
       for(j=0;j<back[i].slides.length;j++){ 
        socket.emit('signUrl',(back[i].slides[j].location)); 
        break; 
       } 
      } 
      socket.on('signedUrls',function(sUrl){ 
       console.log("back from signedUrls" + sUrl); 
       $scope.presentations.push(sUrl); 
      }); 
     }); 
    }); 
}; 
} 
+1

我们可以看到你的'PresentationCtrl'控制器 – dcodesmith

+0

是的,我们真的需要看到控制器的帮助。 –

+0

@dcodesmith,补充。 – Houseman

回答

1

它工作正常。

http://plnkr.co/edit/agadSBFgz8YhWuDTtCPx?p=preview

你的情况可能会有所不同。

--------- ---------编辑

好吧,我有你的局面。你正在运行一个不在AngularJS监视下的函数。 因此,AngularJS不知道你的变量是否改变,基本上不会调用$ digest。

为了模仿原生的Javascript异步调用,我使用setTimeout。

以下代码不是的工作。它改变了价值,但不会被观察。

setTimeout(function() { 
    $scope.presentations = [6,7,8,9]; 
}, 1000); 

但是这个代码不工作。它按预期更改值

$timeout(function() { 
    $scope.presentations = [6,7,8,9]; 
}, 1000); 

setTimeout和$ timeout之间的区别在于$ timeout在AngularJS的监视下运行。 因此,要使其正常工作,您需要在它之后或在其内部运行$scope.apply()作为函数。

此代码确实setTimeout一起使用。

setTimeout(function() { 
    $scope.presentations = [6,7,8,9]; 
    $scope.$apply(); 
}, 1000); 

由于我没有真正掌握AngularJS代码,因此无法详细向您详细解释。

这个博客对我们为什么需要运行$ apply有非常好的解释。

http://jimhoskins.com/2012/12/17/angularjs-and-apply.html

只是冰山,得到的答案很快,最好是在的jsfiddle或plunkr一个简单的例子。
我知道$ http调用不能在plunkr或jsfiddle中演示,但是您可以使用setTimeout来模拟您的情况。大部分时间它可以让读者理解你的情况。

+0

我有一个datatables.net xhr.dt事件不刷新网格相同的问题。 –