Я довольно опытен с нокаутом, но это мой первый раз, когда я использую компоненты, поэтому я действительно надеюсь, что мне не хватает чего-то очевидного! Я попытаюсь немного упростить свой вариант использования, чтобы объяснить мою проблему.Async загружает шаблон в компонент нокаута
У меня есть HTML и JS-файл под названием Index. Index.html имеет привязку данных для компонента, а Index.js имеет вызов ko.components.register
.
index.html
<div data-bind="component: { name: CurrentComponent }"></div>
index.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;
});
Это действительно заменить мой текст по умолчанию с HTML вернулся из API (как показано в инструментах отладки), но это обновление не отражаются в браузере.
Итак, в конце концов, все, о чем я действительно спрашиваю, есть способ обновить содержимое вашего шаблона компонентов после привязки?
Я знаю вариант для решения вышеизложенного, о котором вы могли подумать, - это потребовать шаблон, но я действительно упростил приведенное выше и в его полной реализации, я не могу этого сделать, поэтому, почему HTML возвращенный API.
Любая помощь очень ценится! В настоящее время у меня есть рабочее решение, но мне действительно не нравится, как мне пришлось структурировать JS-код, чтобы он работал, поэтому решение вышеизложенного было бы идеальным.
Спасибо.
Просьба, сделайте MVCE http://stackoverflow.com/help/mcve: укажите минимальный код, необходимый для просмотра того, как выглядит ваш компонент, что вы хотите делать и что неисправен. Ваше Q - неопределенное объяснение проблемы, как указано. – JotaBe
@JotaBe Извинения. Я не прибавил много, поскольку я не был уверен, что это было необходимо. Однако я добавил больше. Благодарю. – yellowbrickcode