2013-05-01 119 views
4

不同的行爲我試圖追加一些元素和我看到一些不同的行爲,當使用內置的jqlite vs使用jQuery。我創建了一個小提琴證明的區別:http://jsfiddle.net/waylon999/5fyBt/1/Angularjs jqlite append()和jquery append()與​​

看來,當我做:

element.append('<td>Val 1</td><td>Val 2</td>'); // jqlite 

插入字符串之前的標籤被剝離。但是,當我嘗試

$(element).append('<td>Val 1</td><td>Val 2</td>'); 

它的工作原理爲我所期望的,其中追加整個字符串ARG追加到標籤。我試了幾件事情,包括

angular.element(element).append(....) 

,但我不能找到一種方法,使其工作。有什麼我不瞭解這應該如何工作?

謝謝!

+0

如果你打算無論如何使用jQuery,你可以只是確保它包括第一,完全避免這個問題。 :) – Langdon 2013-05-01 16:41:03

+0

是的,'是'的權力,如果可能的話,要避免添加完整的jQuery庫。我只想看看我是否找到一個很好的理由來添加它。 :) – user417918 2013-05-01 16:53:52

+1

如果你只是想使用element.html()替換所有的內容,並且它將起作用 – 2013-05-01 16:59:28

回答

4

盡我可以告訴,這是一個錯誤的JQLite:

function JQLite(element) { 

    ... 

    if (isString(element)) { 
     var div = document.createElement('div'); 
     // Read about the NoScope elements here: 
     // http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx 
     div.innerHTML = '<div>&#160;</div>' + element; // IE insanity to make NoScope elements work! 
     div.removeChild(div.firstChild); // remove the superfluous div 
     JQLiteAddNodes(this, div.childNodes); 
     this.remove(); // detach the elements from the temporary DOM div. 
    } else { 
     JQLiteAddNodes(this, element); 
    } 
} 

正如你可能會或可能不知道,你不能做到這一點:

div.innerHTML = '<div></div><td>asdf</td>'; 

td將被刪除。我猜jQuery不會做同樣的事情(也許他們不關心NoScope?)。這就是說,如果你想繼續只使用角度,這工作得很好:

element[0].innerHTML += '<td>Val 1xx</td><td>Val 2yy</td>'; 

我建議您提出對角的GitHub上的問題。

+0

github上已經有一個問題:https://github.com/angular/angular.js/issues/1459 – forivall 2013-05-01 17:54:40

+2

這似乎是一個單獨的(但相似)的問題。每個人似乎都在關注如何解決jqLit​​e的問題,而不是主要的jqLit​​e函數本身。 – Langdon 2013-05-01 18:02:43

0

另一種解決方案是這樣的:

var cells = angular.element('<table><tbody><tr>' + 
           '<td>Val 1</td><td>Val 2</td>' + 
           '</tr></tbody></table>').children().children().children(); 
    element.append(cells); 

這是醜陋的,但我想你可以在一個效用函數包裹。

也許最好的解決辦法就是刪除那個IE精神錯亂一行。

http://jsfiddle.net/5fyBt/2/