Передать объект другой viewmodel, используя pubsub?
Я создал 2 компонента нокаута, используя новую версию 3.2 нокаута (и requirejs).
Первый компонент содержит HTML-шаблон для отображения таблицы объектов, которые содержатся в наблюдаемом массиве в моей модели представления, если компонент.
define(["knockout", "text!./source-table.html", "knockoutpostbox"], function (ko, sourceTemplate) {
function sourceViewModel() {
var self = this;
this.sourceEntries = ko.observableArray();
this.selectedSourceEntry = ko.observable().publishOn("selectedSourceEntry");
$.getJSON('./api/SourceFile').success(function (data, status, xhr) {
console.log(data);
var loadedSourceEntries= [];
$.each(data, function (index, item) {
loadedSourceEntries.push(new sourceEntry(item.ID, item.Order, item.SourceLocation, item.SourceFilename, item.Description, item.Contact, item.PostCommand, item.IsActive, item.Overwrite));
console.log(item);
});
self.sourceEntries(loadedSourceEntries);
});
self.selectSourceEntry = function (data) {
console.log(data);
self.selectedSourceEntry(data.id);
}
};
function sourceEntry(id, order, sourceLocation, sourceFilename, description, contact, postCommand, isActive, overwrite) {
var self = this;
self.id = id;
...
}
return { viewModel: sourceViewModel, template: sourceTemplate };
});
второй компонент содержит HTML-шаблон для показа модального окна для редактирования значений выбранного элемента из моего первого компонента.
define(["knockout", "text!./destination-table.html", "knockoutpostbox"], function (ko, destinationTemplate) {
function destinationViewModel() {
var self = this;
this.destinationEntries = ko.observableArray();
this.selectedDestinationEnty = ko.observable();
this.sourceEntry = ko.observable()
.subscribeTo("selectedSourceEntry", function (newValue) {
$.getJSON('./api/Destinations/' + newValue).success(function (data, status, xhr) {
var loadedDestinationEntries = [];
$.each(data, function (index, item) {
loadedDestinationEntries.push(new destinationEntry(item.ID, item.SourceID, item.DestinationLocation, item.DestinationFilename));
console.log(item);
});
self.destinationEntries(loadedDestinationEntries);
});
});
};
function destinationEntry(id, sourceId, destinationLocation, destinationFilename) {
var self = this;
self.id = id;
self.sourceID = sourceId;
self.destinationLocation = destinationLocation;
self.destinationFilename = destinationFilename;
}
return { viewModel: destinationViewModel, template: destinationTemplate };
});
Как вы можете видеть, я использовал pubsub для передачи выбранного идентификатора из первого компонента. Это используется для компонентов, которым требуется идентификатор для связи с сервером для получения сведений о выбранном исходном элементе. Однако для редактирования выбранного элемента все данные уже известны на клиенте, поэтому дополнительный запрос ajax не должен быть решением, поэтому я хочу сообщить о полном объекте sourceEntry.
возможно ли это с помощью реализации pubsub в knockout-postbox?
Следующий вопрос, возможно, простой. Модель компонента должна быть загружена только при редактировании. Скрытый раздел не имеет смысла с точки зрения производительности. Есть ли способ динамически внедрить компонент во время выполнения с помощью нокаута или мне нужен jquery для динамического добавления компонента. Какова лучшая практика здесь?