У меня возникла проблема, связанная с привязкой данных к нокауту с динамическим сгенерированным полем ввода. В качестве быстрого запуска canActivate (id) я получаю детали всех объектов, необходимых на странице, и сохраняю их в vm.OPCLayoutVm.
var title = 'User Information';
var vm = {
canActivate: canActivate,
attached: attached,
title: title,
OPCLayoutVm: null,
UserInformationVm: ko.observable({}),
UserId:null
};
return vm;
function canActivate(userId) {
var dfd = $.Deferred();
vm.userId = userId.patientId;
if (userID != null) {
$.getJSON('CoreData/GetCoreData').done(function(data) {
vm.OPCLayoutVm = buildViewModel(data);
return dfd.resolve(true);
}).fail(function(e) {
logger.logError('Couldn\'t load core layout', e, 'user-information', true);
return dfd.resolve(false);
});
} else {
return dfd.resolve(true);
}
return dfd;
}
function buildViewModel(data) {
var data_response = data.result;
return data_response;
}
Затем, как только страница загружается, я заполняю динамические поля, и если требуются дополнительные данные, отправьте запрос JSON, чтобы получить его, а затем сохраните как новый объект в vm.UserInformationVm
function attached() {
fnCreateInformationPageStructure();
}
function fnCreateInformationPageStructure() {
//Send json request to get all objects
// go through all objects and create them
// however on specific objects where data is already present send off another json request to get it...
// add binding details to dynamic object
$(inputDiv).find('input')[0].setAttribute("data-bind", "value: vm.UserInformationVm." + (matching data name to the json returned data below) + ".data");
//request data and add to vm.UserInformationVm
if (dataItem.DatabaseTableName != null && dataItem.TableFieldName != null) {
$.getJSON("CoreData/GetObjectData?id=" + vm.UserId + '&tableName=' + dataItem.DatabaseTableName + '&columnName=' + dataItem.TableFieldName).done(function (result) {
extendObject(vm.UserInformationVm, [result.result[0].column, new DataBindObject(result.result[0].data,result.result[0].columnName,result.result[0].tableName)]);
});
}
}
// Other used function
function extendObject(obj, props) {
for (var i = 0; i < props.length; i+=2)
obj[props[i]] = props[i+1];
}
function DataBindObject(dataitem, columnName, tableName) {
this.data = ko.observable(dataitem);
this.column = columnName;
this.table = tableName;
}
Тем не менее, используя все это, как и следовало ожидать, поле ввода с привязкой данных просто не хочет отображать данные в vm.UserInformationVm (соответствующий объект).
Есть идеи?
-Обновить-
Текущая структура данных UserInformationvm выглядит как...
-UserInformationVm
-userForename (dynamically generated)
-userSurname (dynamically generated)
-data (ko.observable)
-table
-column
EDIT Your PatientInformationVm должен быть объектом наблюдаемых, не так ли?
Затем вы замените функцию extendObject на
function extendObject(obj, props) {
for (var i = 0; i < props.length; i+=2)
if (ko.isObservable(obj[props[i]]))
obj[props[i]](props[i+1]);
else
obj[props[i]] = props[i+1];
if (ko.isObservable(obj)) obj.valueHasMutated();
}
PatientInformationVm
?