如何收集Knockout可观察性以放入JSON

How to gather Knockout observables to put in JSON?

本文关键字:JSON 可观察性 何收集 Knockout      更新时间:2023-09-26

我真的,真的再也不明白了。我正在尝试使用Knockout开发一个接口,但尝试"toJSON"会让我头疼。

问题如下:

  • 我有一个FormViewModel。该表单包含关于表单本身的逻辑和元数据(可观察数据)
  • 我有FormSection,它只有2个可观察器
  • 我有删除,也只有2个可观察

我想将其AJAX到一个接收JSON对象的PHP文件中,但我不知道如何从这里开始。我只想要一些可观察性,而不是全部。我还希望能够通过Ajax调用(使用JSON)加载初始状态。

以下是我的代码的相关部分:

    // This only has some observables
    var FormSection = function(number)
    {
        var self = this;
        this.title = ko.observable('Section ' + number);
        this.selectedPageStyle = ko.observable();
    };
    // Only observable / computed
    var Deletion = function(page)
    {
        var self = this;
        // reference to a just deleted page, to make 'undeletion' possible
        this.page = page;
        this.pageTitle = ko.computed(function(){ return self.page.title() });
    };

到目前为止还不错,但我的ViewModel具有一些可观察性、一些功能等。这就是我迄今为止所拥有的:(为了可读性,我删除了函数体)

var FormViewModel = function(data)
{
    var self = this;
    this.pages = ko.observableArray([]);
    this.deletions = ko.observableArray([]);
    this.name  = ko.observable();
    this.description = ko.observable();
    this.availablePageStyles = ko.observableArray(['Header', 'Fields', 'Signatures']);
    this.hasPages = ko.computed(function(){}, this);
    this.numberOfPages = ko.computed(function(){}, this);
    self.selectedPage = ko.observable( );
    self.isPageSelected = function(page) {};
    self.clearPage = function(data, event) {};
    this.save = function() {
        $.ajax("x", {
            // WHAT TO DO?!
            data: { data: ko.toJSON(this)},
            type: "post",
            //success: function(result) { alert(result) },
            error : function(jqXHR, textStatus, errorThrown) { alert(textStatus + errorThrown)}
        });
    };
    $.getJSON("x", function(allData) {
        // How to populate back?!
    });
    this.addPage = function(data, event){}
    this.removePage = function(page){}
    this.unremovePage = function(deletion){}
};

如果我想保存相关的可观察性,我不知道如何进行。例如:我不需要self.selectedPage。我只把它用于排序。

  • 我在这里使用映射吗
  • 如何映射相关的可观察性
  • 如何将其放入JSON中
  • 如何从服务器接收的JSON"映射回"

要控制使用ko.toJSON时转换为JSON的内容,可以通过执行来重载函数

viewModel.prototype.toJSON = function(){
    var copy = this;
    delete copy.//whatever variables you don't want to return to server here
    //any other variables you want to not return
    return copy;
}

我组装了一把样品小提琴http://jsfiddle.net/Rynan/hA4Kz/.

有关更多信息和示例,请参阅http://www.knockmeout.net/2011/04/controlling-how-object-is-converted-to.html