在使用Knockout从Json创建对象时遇到麻烦

Trouble creating object from Json using Knockout

本文关键字:创建对象 遇到 麻烦 Json Knockout      更新时间:2023-09-26

好的,这个场景是我有一个对象列表,它本身包含一个对象列表。我试图把外部对象在我的视图模型列表,我试图把内部对象变成一个对象,我创建了一个具有额外属性的模型,像这样-

function Tag(data, isChecked) {
    var TagId = ko.observable(data.TagId);
    var Description = ko.observable(data.Description);
    var IsActive = ko.observable(data.IsActive);
    var checked = ko.observable(isChecked)
}

我是这样做的。

   $.each(parentTags, function (i, tag) {
    var tempTag = tag[i];
    for (Object in tag.ChildTags)
    {
        var checked = false;
        for(checkedItem in savedTags)
        {
            if(tag.ChildTags[Object].TagId === savedTags[checkedItem])
            {
                checked = true;
            }
        }
        //var tempChild = new Tag(tag.ChildTags[Object], checked);
        tempTag.ChildTags.push(new Tag(tag.ChildTags[Object], checked));
    }
    viewModel.ModelTags.push(tempTag);
});

parentTags = [[object object],[object object],[object object],[object object],[object object],[object object],]

我绝对是json和knockout的新手。任何帮助都会很感激。

这是我现在拥有的,它似乎正在工作。

    $.each(parentTags, function (i, tag) {
    var tempTag = new Tags(JSON.parse(JSON.stringify(tag)));
    tempTag.ChildTags().length = 0;
    for (Object in tag.ChildTags) {
        var checked = false;
        for (checkedItem in savedTags) {
            if (tag.ChildTags[Object].TagId === savedTags[checkedItem]) {
                checked = true;
            }
        }
        tempTag.ChildTags().push(new Tag(tag.ChildTags[Object], checked));
    }
    viewModel.ModelTags().push(tempTag);
});

你对var tempTag = tag[i];做了什么?变量tag已经是parentTags的第i个成员。

如果我没理解错的话,试试这个:

function Tag(data, isChecked) {
   // not "var TagId", please.
   this.TagId = ko.observable(data.TagId);
   this.Description = ko.observable(data.Description);
   this.IsActive = ko.observable(data.IsActive);
   this.checked = ko.observable(isChecked);
}
$.each(parentTags, function (i, tag) {
    // map each child tag into a Tag object
    var tags = $.map(tag.ChildTags, function(cTag) {
        return new Tag(cTag, $.inArray(cTag.TagId, savedTags));
    });
    // replace with Tag objects
    tag.ChildTags = tags;
    // push modified tag onto vm
    viewModel.ModelTags.push(tag);
});