Knockout.js 如何在Jasmine测试中重置敲除绑定

Knockout.js 如何在Jasmine测试中重置敲除绑定,knockout.js,binding,jasmine,reset,Knockout.js,Binding,Jasmine,Reset,我正试图用jasmine为击倒功能编写测试,如下所示,我得到以下错误: 错误:不能对同一元素多次应用绑定 我确实尝试过重置ko as,但结果是一样的 afterEach(()=>{ ko.cleanNode($('#MobileMainNavLink')[0]); ko.cleanNode($('#sidebar-wrapper')[0]); }); 基于ko文档,cleanNode是一个内部函数,不是API的一部分 我使用的是ko 3.2和ja

我正试图用jasmine为击倒功能编写测试,如下所示,我得到以下错误:

错误:不能对同一元素多次应用绑定

我确实尝试过重置ko as,但结果是一样的

 afterEach(()=>{
        ko.cleanNode($('#MobileMainNavLink')[0]);
        ko.cleanNode($('#sidebar-wrapper')[0]);
    });
基于ko文档,cleanNode是一个内部函数,不是API的一部分


我使用的是ko 3.2和jasmine 1.5,而不是显式地将绑定应用于节点。因此,我相信这将适用于您的文档.body。这就解释了你的错误,你没有清洁身体

ko.应用绑定(测试主题)

参考:

如果您想知道ko.applyBindings的参数是什么

第一个参数表示要使用的视图模型对象 它激活的声明性绑定

或者,您可以传递第二个参数来定义 要搜索数据绑定属性的文档。例如 ko.applyBindings(myViewModel, document.getElementById('someElementId'))。这限制了 激活ID为someElementId的元素及其子元素, 如果希望有多个视图模型并关联,则此选项非常有用 每个页面都有一个不同的区域

有用功能:

// Checks if Element has Already been Bound (Stops Errors Occuring if already bound as element can't be bound multiple times)
var isBound = function (id) {
    if (document.getElementById(id) != null)
        return !!ko.dataFor(document.getElementById(id));
    else
        return false;
};
答复:

testSubject = new Mobile.Navigation.ThreeStepNavigation.View();
if (isBound("parent-container"))
    ko.cleanNode(document.getElementById('parent-container'));
ko.applyBindings(testSubject, document.getElementById("parent-container"));

看起来KO不止一次被捆绑。我只能猜测这是在loadfixtures步骤或视图实例化期间发生的。尝试注释掉
ko.applyBindings(testSubject)…加上您的测试有点奇怪,因为它似乎在运行测试时根据屏幕大小有不同的断言,这可能不是一个好主意(除非我遗漏了什么)。尝试了
removeNode
,它类似于
cleanNode
(从DOM中删除节点)
testSubject = new Mobile.Navigation.ThreeStepNavigation.View();
if (isBound("parent-container"))
    ko.cleanNode(document.getElementById('parent-container'));
ko.applyBindings(testSubject, document.getElementById("parent-container"));