Ich habe viele (KnockOut) Ansicht Modelle, die Daten von einem Rest-Service erhalten und dann "Element" Ansicht Modelle, die ziemlich einfach sind und nur die Felder aus der REST-Schnittstelle enthalten.Dynamic Item ViewModel Knockout
Ich habe mich nur gefragt, ob es eine Möglichkeit gab, die Item-Viewmodels nicht zu definieren, sondern sie nur dynamisch als Objekte zu erstellen (wobei jede Eigenschaft beobachtbar ist).
Also im folgenden Beispiel möchte ich nicht das "ItemViewModel" haben, sondern einfach innerhalb der AddItems-Funktion sagen, dass es ein Objekt basierend auf den Daten erstellen und jeden Eintrag ko.observable machen soll. Der übergebene "itemName" enthält dann "ItemViewModel1" (oder in einem anderen Aufruf "ItemViewModel2" ... etc).
Also z.B. wenn die Json Ruhe Eingang ein Feld „LAST_NAME“ hat, würde es hinzufügen self.LAST_NAME = ko.observable()“mit diesem Wert gefüllt usw. (so kann ich es immer noch in den Ansichten verweisen).
var ItemViewModel1 = function (data) {
var self = this;
self.PAR1 = ko.observable(data.PAR1)
self.PAR2 = ko.observable(data.PAR2)
self.PAR3 = ko.observable(data.PAR3)
self.PAR4 = ko.observable(data.PAR4)
// … etc
}
var MasterViewModel1 = function (data) {
var self = this;
ReportBaseViewModel.call(self)
}
var ReportBaseViewModel = function() {
var self = this;
/* commonly used vars */
self.report = ko.observable();
self.searchedCallBackFunction = ko.observable();
self.items = ko.observableArray();
self.selecteditem = ko.observable();
self.selectedPerson = ko.observable();
/* method: print */
self.PrintEventHandler = function (data) { window.print(); };
/* method: add items to array */
self.AddItems = function (data) {
var newitems = ko.utils.arrayMap(data, function (item) {
c = new window[self.itemname](item);
return c;
});
self.items(newitems);
};
/* eventhandler: select one item */
self.SelectEventHandler = function (item) {
selecteditem(item);
};
self.GetReport = function (selectedPerson, viewContainer, url, itemName) {
self.selectedPerson(selectedPerson);
self.itemname = itemName;
var jqxhr = $.ajax({
url: url,
type: "GET"
}).done(function (data, textStatus, jqXHR) {
if (data != null) {
self.AddItems(data);
$('#' + viewContainer).show();
document.getElementById(viewContainer).scrollIntoView();
}
}).fail(function (jqXHR, textStatus, errorThrown) {
console.log('fail' + JSON.stringify(jqXHR));
toastr.options = {
"closeButton": true,
"debug": false,
"newestOnTop": false,
"progressBar": false,
"positionClass": "toast-top-right",
"preventDuplicates": false,
"onclick": null,
"showDuration": "0",
"hideDuration": "1000",
"timeOut": "0",
"extendedTimeOut": "0",
"showEasing": "swing",
"hideEasing": "linear",
"showMethod": "fadeIn",
"hideMethod": "fadeOut"
};
toastr["error"]("ERROR");
}).always(function (jqXHR, textStatus, errorString) {
if (typeof self.searchedCallBackFunction() === 'function') {
self.searchedCallBackFunction();
}
});
}
}