Не удалось выполнить привязку данных на странице, управляемой базой данных, с помощью API Hot Towel

0

У меня возникла проблема, связанная с привязкой данных к нокауту с динамическим сгенерированным полем ввода. В качестве быстрого запуска 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
Теги:
http
knockout.js
hottowel

1 ответ

0

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();
}
  • 0
    Немного поиграл и, видимо, нет, он воспринимает это как функцию, которой, конечно, не существует. Хотя это может быть частью решения, так что я продолжу играть, ура.
  • 0
    Но обновили ли вы свою модель представления, чтобы включить PatientInformationVm ?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню