Javascript 在清理和重新应用与子viewModels的绑定时复制元素

Javascript 在清理和重新应用与子viewModels的绑定时复制元素,javascript,knockout.js,Javascript,Knockout.js,我有一个viewModel,其中包含ObservalArray中的子viewModels,它使用foreach绑定绑定到一些标记 在页面生命周期的后期,我需要删除旧的viewModel并在其位置应用新的viewModel。为此,我调用ko.cleanNode(),然后使用新的视图模型调用applyBindings 出于某种原因,当发生这种情况时,所有子视图模型最终都会得到重复的标记,即使父ObservalArray中的viewModels数量正确 我确信我只是错误地使用了一些击倒功能,但我不知道

我有一个viewModel,其中包含ObservalArray中的子viewModels,它使用foreach绑定绑定到一些标记

在页面生命周期的后期,我需要删除旧的viewModel并在其位置应用新的viewModel。为此,我调用ko.cleanNode(),然后使用新的视图模型调用applyBindings

出于某种原因,当发生这种情况时,所有子视图模型最终都会得到重复的标记,即使父ObservalArray中的viewModels数量正确

我确信我只是错误地使用了一些击倒功能,但我不知道如何让它工作

问题在此处重复:

标记:

<div class="container">
    <label>RANGES</label>
    <div class="rangeContainer" data-bind="foreach: ranges">
        <div class="range"> 
            <span>START <br /><span data-bind="text: start"></span></span>
            <span>END <br /><span data-bind="text: end"></span></span>
        </div>
    </div>
</div>

使用带有绑定的
,以交换视图模型
cleanNode
是一种未记录的方法

<div class="container" data-bind="with: viewModel">
    ...
</div>

...

使用带有
绑定的
,以交换视图模型
cleanNode
是一种未记录的方法

<div class="container" data-bind="with: viewModel">
    ...
</div>

...

在页面生命周期的后期,我需要删除旧的viewModel和 在其位置上应用一个新的

替换视图模型的更好方法是使视图模型本身成为可观察的:

var vm = ko.observable(new ParentViewModel(
{
    Ranges: [{
        Start: '/Date(1439438400000)/',
        End: '/Date(1439611200000)/'
    },
    {
        Start: '/Date(1439265600000)/',
        End: '/Date(1439352000000)/'
    }]
}));

ko.applyBindings(vm);
然后,当您要替换它时:

vm(new ParentViewModel({
    Ranges: [{
        Start: '/Date(1439438400000)/',
        End: '/Date(1435611200000)/'
    }]
}));

在页面生命周期的后期,我需要删除旧的viewModel和 在其位置上应用一个新的

替换视图模型的更好方法是使视图模型本身成为可观察的:

var vm = ko.observable(new ParentViewModel(
{
    Ranges: [{
        Start: '/Date(1439438400000)/',
        End: '/Date(1439611200000)/'
    },
    {
        Start: '/Date(1439265600000)/',
        End: '/Date(1439352000000)/'
    }]
}));

ko.applyBindings(vm);
然后,当您要替换它时:

vm(new ParentViewModel({
    Ranges: [{
        Start: '/Date(1439438400000)/',
        End: '/Date(1435611200000)/'
    }]
}));

请参见

为什么要使用
cleanNode
?您可能打算将
if
绑定一起使用。为什么要使用
cleanNode
?您可能打算将
if
绑定一起使用。太棒了,太棒了。