【发布时间】:2012-07-29 06:56:12
【问题描述】:
我正在使用以下内容:
- knockout-2.1.0.js
- koExternalTemplateEngine_all.js
我想要达到的目标如下:
- 模板容器加载外部 HTML 并为该 HTML 加载特定 VM(有效)。
- 模板容器加载/切换到另一个外部 HTML,以及该 HTML 的另一个特定 VM(有效)。
- 模板容器切换回第一个模板/VM,以及它们的 VM(不起作用!)。
我猜它不起作用的原因是因为模板是在虚拟机之前加载的(它确实给了我绑定错误)。
我的网站结构是这样的(不包括上面提到的库):
-
index.html(持有模板容器) -
js/script.js(持有主 ViewModel) -
js/firstvm.js(持有第一个 ViewModel) -
js/secondvm.js(持有第二个 ViewModel) -
tmpl/firstvm.html(第一个虚拟机的模板) -
tmpl/secondvm.html(第二个虚拟机的模板)
Or simply download the source and view the problem.
最重要的部分:
-
index.html
<button data-bind="click: loadFirstPage">Load first page + ViewModel</button> <button data-bind="click: loadSecondPage">Load second page + ViewModel</button> < hr /> <div data-bind="template: { name: function() { return currentTemplate(); }, data: currentData }"></div> -
script.js
function IndexViewModel() { var vm = this; this.currentTemplate = ko.observable(); this.currentData = ko.observable(); this.loadFirstPage = function() { vm.currentTemplate("firstvm"); vm.currentData(new FirstViewModel()); }; this.loadSecondPage = function() { vm.currentTemplate("secondvm"); vm.currentData(new SecondViewModel()); }; this.loadFirstPage(); }; ko.applyBindings(new IndexViewModel()); -
firstvm.html
<p data-bind="text: displayValue"></p> -
secondvm.html
<p data-bind="text: displayValue2"></p> -
firstvm.js
function FirstViewModel() { this.displayValue = ko.observable("Text from firstvm.js"); }; -
secondvm.js
function SecondViewModel() { this.displayValue2 = ko.observable("Text from secondvm.js"); };
我希望有人可以帮助我解决这个问题。提前致谢!
附言。忘了提一下:当按下“首页”按钮两次时,它似乎确实有效(可能是因为加载了正确的 VM)。
【问题讨论】:
-
您是否尝试过更改模板:{name: } 绑定以直接绑定到计算的或可观察的而不是函数? ko 应该自动评估这种情况下的变化。
-
@Nick 是的。可悲的是,这不起作用..
-
data-bind="template: { name: currentTemplate, data: currentData }"为我工作。
标签: javascript templates mvvm knockout.js