当页面通过ajax作为部分加载时,如何重新绑定淘汰视图模型?
Posted
技术标签:
【中文标题】当页面通过ajax作为部分加载时,如何重新绑定淘汰视图模型?【英文标题】:How do I rebind the knockout viewmodel when the page is loaded in as a partial via ajax? 【发布时间】:2014-02-10 04:04:55 【问题描述】:我正在使用的页面有几个选项卡,每个选项卡的内容通过 ajax 加载,方法是从控制器请求部分视图。问题是局部视图使用了knockoutjs,所以绑定到一个视图模型。在这个特定的场景中,页面是第一次完整加载的,所以所有的绑定都可以正常工作。当您切换选项卡时,它会请求部分视图并将选项卡内容区域替换为新页面。当您切换回第一个选项卡时,它会成功加载部分,但似乎所有敲除绑定都已丢失,因此丢失了很多数据。
我无法将 viewmodel 声明和模型绑定放在部分中,因为此时尚未加载 jquery。或者看起来是这样($ 没有定义)。
视图模型是在调用局部视图的主页上声明和绑定的,而不是局部视图本身,所以我认为模型仍然可用并成功绑定,但事实并非如此。我知道我做错了,当涉及到 javscript 时,部分观点非常不稳定,所以我希望从你们那里窃取一些见解。
这是基本设置:
【问题讨论】:
【参考方案1】:如果您能够绑定到页面的特定非重叠区域,那么您可以选择调用ko.applyBindings(someViewModel, someDomElement)
,如以下答案:Can you call ko.applyBindings to bind a partial view?
但是,如果您有一个整体视图模型绑定到页面,然后通过部分加载的内容“孤岛”要稍后绑定,那么一种选择是这样:@987654322 @。因此,您将在您的部分所在的容器上设置一个绑定,告诉 Knockout 将其手从该区域移开。然后当你加载部分时,你可以安全地调用ko.applyBindings(someViewModel, innerContainer)
。
绑定可能如下所示:
ko.bindingHandlers.stopBinding =
init: function()
return controlsDescendantBindings: true ;
;
你会像这样使用它:
<div id="outerContainer" data-bind="stopBinding: true">
<div id="innerContainer">
...load your partial here
</div>
</div>
那么,ko.applyBindings(someViewModel, document.getElementById("innerContainer"));
【讨论】:
以上是关于当页面通过ajax作为部分加载时,如何重新绑定淘汰视图模型?的主要内容,如果未能解决你的问题,请参考以下文章
在 Oro 平台上使用 Ajax 加载模板时如何触发页面组件事件?
当数据在javascript codeigniter php中使用ajax成功功能时,如何禁用页面重新加载?