【问题标题】:Failed knockout data-bind on database driven page using Hot Towel API使用 Hot Towel API 在数据库驱动页面上的剔除数据绑定失败
【发布时间】:2014-04-28 21:49:11
【问题描述】:

我在将剔除数据绑定到动态生成的输入字段时遇到问题。作为对 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

【问题讨论】:

    标签: jquery http knockout.js hottowel


    【解决方案1】:

    编辑 您的 PatientInformationVm 应该是 observables 的对象,不是吗?

    然后,您将用

    替换您的 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
    • 啊抱歉刚刚在我的问题中发现了一个错误,所有的 patientInformationVm 引用都应该是 userInformationVm。它也是 DataBindObject 对象的对象,其中的数据项是目前唯一需要的 observable。
    • 修改了问题,还添加了我目前看到的数据结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    相关资源
    最近更新 更多