我对 Knockout 非常有经验,但这是我第一次使用组件,所以我真的希望我错过了一些明显的东西!我将尝试简化我的用例来解释我的问题。
我有一个名为 Index 的 HTML 和 JS 文件。Index.html 具有组件的数据绑定,而 Index.js 具有ko.components.register
调用。
索引.html
<div data-bind="component: { name: CurrentComponent }"></div>
索引.js
var vm = require("SectionViewModel");
var CurrentComponent = ko.observable("section");
ko.components.register("section", {
viewModel: vm.SectionViewModel,
template: "<h3>Loading...</h3>"
});
ko.applyBindings();
然后我有另一个 HTML 和 JS 文件 - Section.html 和 SectionViewModel.js。正如您在上面看到的,SectionViewModel 是我指定为组件的视图模型。
Section.html
<div>
<span data-bind="text: Section().Name"></span>
</div>
SectionViewModel.js
var SectionViewModel = (function() {
function SectionViewModel() {
this.Section = ko.observable();
$.get("http://apiurl").done(function (data) {
this.Section(new SectionModel(data.Model)); // my data used by the view model
ko.components.get("dashboard", function() {
component.template[0] = data.View; // my html from the api
});
});
}
return SectionViewModel;
});
exports.SectionViewModel = SectionViewModel;
作为 SectionViewModel 中的构造函数的一部分,我调用我的 API 以获取填充我的视图模型所需的所有数据。此 API 调用还返回我需要在模板中使用的 HTML(基本上是从 Section.html 中读取的)。
显然,在调用 applyBindings 之前不会调用此构造函数,因此当我进入 API 调用的成功处理程序时,组件上的模板已设置为我的默认文本。
我需要知道的是,我可以更新这个模板吗?如上所示,我在成功处理程序中尝试了以下内容:
ko.components.get("section", function(component) {
component.template[0] = dataFromApi.Html;
});
这确实将我的默认文本替换为从我的 API 返回的 html(如调试工具中所示),但此更新不会反映在浏览器中。
所以,基本上毕竟,我真正要问的是,有没有办法在绑定后更新组件模板的内容?
我知道解决上述问题的一个选项可能是需要模板,但我确实简化了上述内容并且在它的完整实现中,我无法做到这一点,因此 API 返回 HTML .
非常感谢任何帮助!我目前确实有一个可行的解决方案,但我真的不喜欢我必须构建 JS 代码以使其工作的方式,因此上述解决方案将是理想的。
谢谢。