2014-01-18 86 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事件不刷新網格相同的問題。 –