0

我在使用 Knockout Mapping 时遇到问题。

我有一个 FormBuilderViewModel,包含一堆功能,包括加载和保存数据。第一行(self = this 之后)如下:

this.form = ko.mapping.fromJS({blueprint_identifier: undefined, name: undefined, description: undefined, pages : []})

我用 3 个元变量和 1 个数组初始化“this.form”。

然后,我加载数据(也在 FormBuilderViewModel 中):

ko.mapping.fromJSON(allData, {}, self.form);

该变量allData来自 AJAX 请求,并且包含以下内容: {"blueprint_identifier":1347437911,"name":"test","description":"test","pages":[]}

问题是:加载的 JSON 从未出现在我的页面上。console.log(this.form)加载数据后的输出为空。这是整个脚本(除了函数等):

var FormBuilderViewModel = function(data){
    var self = this;

    this.form = ko.mapping.fromJS({
                   blueprint_identifier: undefined, 
                   name: undefined, 
                   description: undefined, 
                   pages : []
                })

    $.getJSON("x", function(allData) {
        if(){
            console.log("I'm here");
            ko.mapping.fromJSON(allData, {}, self.form);
        }else{
            // not relevant
        }
    });
    console.log(self.form); 
};

输出是“我在这里”(所以我们到达加载点),然后是空的“表单”对象。

我在这里想念什么?

4

2 回答 2

0

$.getJSON功能有效async,因此当您调用console.log(self.form)映射时未完成。要在控制台输出中查看您的对象,请将日志操作移动到成功函数中:

$.getJSON("x", function(allData) {
    if(){
        console.log("I'm here");
        ko.mapping.fromJSON(allData, {}, self.form);
        console.log(self.form);
    }else{
        // not relevant
    }
});

尝试使用ko.mapping.fromJS而不是ko.mapping.fromJSON因为allData不是fromJSON预期的字符串:

$.getJSON("x", function(allData) {
    if(){
        console.log("I'm here");
        ko.mapping.fromJS(allData, {}, self.form);
        console.log(self.form);
    }else{
        // not relevant
    }
});
于 2012-09-12T10:02:26.440 回答
0

这是一个功能齐全的小提琴,可以满足您的需求:

http://jsfiddle.net/jearles/Cm4xS/

我用一个空的 observable 初始化表单,然后在 AJAX 调用返回时加载它。通过使用with绑定,在加载之前我不会尝试显示表单。

于 2012-09-12T10:21:35.060 回答