2015-09-03 62 views
1

就像標題所說的,我不明白爲什麼在指令的鏈接函數中操作DOM時需要$ timeout。爲什麼在修改dom角度時需要超時

下面的代碼工作。 有問題的元素是一個1x1格,它包含一個視頻插件的容器。 如果我刪除$超時,元素不會調整大小,並且不可見。 刪除$超時並用$ rootScope代替$ apply()不起作用。沒有等待的Ajax電話。我只是想調整用戶操作的元素。

我的問題是,超時時間真的是任意的,在較舊的計算機上運行的舊瀏覽器我需要一個更大的超時值在1500毫秒的範圍內,這約90%的時間。即使1500毫秒也是荒謬的,我當然不想讓它變得更大。

var containerBoundingBox; 
$timeout(function() { 
    containerBoundingBox = element[0].getBoundingClientRect(); 
    $log.warn('containerBoundingBox: ', containerBoundingBox); 
    getActiveVideoElement().css({ 
    'position': 'fixed', 
    'z-index': 1000000, 
    'top': containerBoundingBox.top + 'px', 
    'left': containerBoundingBox.left + 'px', 
    'width': containerBoundingBox.width + 'px', 
    'height': containerBoundingBox.height + 'px' 
    }); 
}, 100); 

元素碼,從活頁採取: 這是我沒有調整對象標記的DIV。

<div class="pluginContainer ng-scope ng-isolate-scope" id="pluginContainer" style="position: fixed; top: 1px; left: 1px; width: 1px; height: 1px; z-index: 1000000;"><object type="application/x-xxxx" style="width: 100%; height: 100%;" id="xxxxxPlugin"></object></div> 
+1

這完全取決於視頻插件,這個微不足道的細節在問題中被省略了。 – estus

+0

請提供更多代碼。如果'getActiveVideoElement()'返回jQuery對象,我認爲它應該沒有超時或$ apply() – latata

+0

這個元素是一個jqLit​​e對象,被禁止使用jQuery。 –

回答

3

超時是允許從最後一個angularjs摘要循環完成DOM操作所必需的。如果沒有這個,你將不會看到高度,文本,樣式,分類等有任何變化。

另外,如果在超時後沒有包含時間,超時將在摘要完成後立即發生。有一種情況我們需要在此之外訪問,並使用了未公開的功能$$ postDigest,這使我們能夠從摘要中收集數據,而不包括瀏覽器事件。

+0

試圖刪除超時值,但顯示仍然沒有更新。也試過[http://ng-learn.org/2014/01/Dom-Manipulations/](http://ng-learn.org/2014/01/Dom-Manipulations/)'code //編譯一段的HTML包含指令 $ compile(element)($ scope); $ scope。$ digest();代碼「,它也沒有工作要麼 –

+0

我需要看到更多的代碼,如果你可以建立一個工作原型,我可以幫助調試。順便說一下,DOM操作在角度上非常不滿意,你應該讓角度做這項工作。我遇到這種情況不可能的情況是基於其他項目的固定定位項目。 – Vince

+0

我們有類似的問題不確定這是否有幫助,但我們使用了一種樣式來處理iframe。元素{min-width:100vw!important;最小高度:100vh!重要; } – Vince

0

在角有消化其通常由被標註有其使所述頁的頁/部分重繪綁定DOM操作引起的週期。 當你執行一個與angular的內部機制無關的操作時,框架並不知道應該啓動一個digest循環,因此你有時需要明確地告訴它這樣做。

+1

問題不在於我想的摘要。 – latata

+0

也許你使用templates/cloneNode等替換了一個新元素。我將元素ref保存在本地變量中,並將它與稍後DOM中的元素進行比較。無論如何,我認爲你需要提供有關這個問題的更多細節。 – Sagi

+0

@latata我相信你是對的。除非我像做手動調整瀏覽器窗口的大小那樣去除超時值(它應該在$ digest循環之後立即觸發超時值,正如Vince指出的那樣)會導致顯示不被更新。 –

相關問題