Я решил эту проблему, применив привязки данных к элементу head, или вы также можете применить его к элементу html, как упоминал Крис Нолл в предыдущем ответе.
Затем приступил к добавлению привязки «текст»к элементу title:
<title data-bind="text: title"></title>
Чтобы связать значение с атрибутом содержимого метатега a, я создал пользовательскую привязку:
// extra custom binding to bind content attribute of meta element
ko.bindingHandlers.metaContent = {
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
// This will be called once when the binding is first applied to an element,
// and again whenever any observables/computeds that are accessed change
// Update the DOM element based on the supplied values here.
let contentAttribute = 'content';
if (contentAttribute in element) {
let value = valueAccessor();
let valueUnwrapped = ko.unwrap(value);
if (valueUnwrapped)
element.content = valueUnwrapped;
}
}
};
Элемент meta с привязкой данных дляАтрибут содержимого с использованием пользовательской привязки:
<meta name="description" data-bind="metaContent: description" />
Для полноты моей viewmodel:
export class Head {
public title: KnockoutObservable<string> = ko.observable("My title");
public description: KnockoutObservable<string> = ko.observable("My description");
constructor() {
ko.applyBindings(this, $("head")[0]);
}
}