我在Jasmine中测试Backbone View。当我调用视图的remove
方法时,该元素实际上并未被删除。
我在视图中有这个事件处理程序:
onModelChange: function() {
this.$el.html('');
this.render();
}
我必须以这种方式编写,因为手动设置html是删除它的唯一方法。调用删除不会执行任何操作,并且当视图再次呈现时,它只会将新内容添加到旧内容中。我甚至尝试从Chromium中的开发人员工具中调用remove,但这也没有用。但是,当我在浏览器中手动测试时,删除功能会起作用,但它在Jasmine中不起作用,而且它会搞砸我的测试。
答案 0 :(得分:1)
我认为问题的答案在于jQuery源代码:
remove: function( selector, keepData /* Internal Use Only */ ) {
var elem,
elems = selector ? jQuery.filter( selector, this ) : this,
i = 0;
for ( ; (elem = elems[i]) != null; i++ ) {
if ( !keepData && elem.nodeType === 1 ) {
jQuery.cleanData( getAll( elem ) );
}
if ( elem.parentNode ) {
if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
setGlobalEval( getAll( elem, "script" ) );
}
elem.parentNode.removeChild( elem ); // right here to be specific
}
}
return this;
},
remove函数依赖于节点的父节点来执行删除。我猜测当测试在业力中运行时,骨干视图的节点没有父节点。为了更多地探索,我调试了测试。在控制台中,如果我查询视图元素的子节点并将其删除,则可以正常工作。