2013-05-01 75 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/