2015-10-16 105 views
0
用帆布項目

我已經NG-重複循環:文檔的getElementById在NG重複的DOM元素返回null

<ul> 
    <li ng-repeat="item in todos"> 
     <canvas id="canvas-{{item.Guid}}"></canvas> 
    </li> 
</ul> 

某處在代碼中,有功能addTodo,這是莫名其妙地想:

  $scope.todos.push(newTodo); 
      $scope.renderPDF(newTodo.Attachment,cxId); 

其中,cxId是畫布ID,而renderPDF使用getElementById在畫布上呈現某些內容。 但是,當我添加待辦事項,雖然在Chrome開發者控制檯有正確的編號的畫布,我得到的錯誤,在cxId上的getElementById返回null。 所有工作都正確完成,Angular使用雙向數據綁定,那麼爲什麼會出現問題?

+0

你什麼時候運行'.getElementById'?在ngRepeat編譯元素之前還是之後? –

+0

將元素添加到數組後使用它。在添加到數組之後和使用getElementById之後有一段時間。但我想我在摘要週期結束前調用getElementById,所以通過ng-repeat編譯.. – cyan

回答

0

我想解釋一下,因爲它很奇特。 Angular使用雙向數據綁定,但在ng-book中我讀到了這個過程。 並且所有在視圖中的參數(在這種情況下,還包括生成畫布ID的todos),所有這些參數都在範圍內。根據他們的變化,有變化的觀點。這個過程是雙向數據綁定。它發生在消化循環中。所以有一段時間要做到這一點,當我推動待辦事項數組時,它還沒有開始這個摘要循環。 解決辦法是強制添加元素陣列後消化週期,什麼都會聽的變化範圍變量:

相反的:

$scope.todos.push(newTodo);  
$scope.renderPDF(newTodo.Attachment,cxId); 

應該有:

$scope.todos.push(newTodo);  
$scope.apply(); 
$scope.renderPDF(newTodo.Attachment,cxId); 

適用法強制實施消化週期。

+0

但是我有消息$ apply已經在進行,但是getElementById中沒有null。我對嗎? – cyan

+1

請使用編輯按鈕來擴展您的問題,而不是發佈答案 – maurycy

+0

爲什麼?有一個選項可以回答你自己的問題,在發佈問題時,爲什麼不使用它? – cyan