【问题标题】:How to gather Knockout observables to put in JSON?如何收集 Knockout observables 以放入 JSON?
【发布时间】:2012-09-11 11:31:51
【问题描述】:

我真的,真的不明白了。我正在尝试使用 Knockout 开发接口,但尝试“toJSON”让我很头疼。

问题如下:

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

我想 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){}

};

如果我想保存 相关 observables,我不知道如何进行。例如:我不需要self.selectedPage。我只用它来排序。

  • 我在这里使用映射吗?
  • 如何映射相关的 observables?
  • 如何将其放入 JSON 中?
  • 如何从我从服务器收到的 JSON 中“映射回”?

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    要控制在使用 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

    【讨论】:

    • 您可能不想从视图模型中删除字段,而是要删除数据的实际副本……您错过了关键部分。
    • 这就是它正在做的事情,它正在从 this 的副本中删除字段,这是传递给 ko.toJSON() 的参数。请注意,即使在 ko.toJSON() 函数中删除了 greeter 变量,它仍会显示。
    • 使用 ko.mapping.toJS(model, mappingParms) 方法并在映射参数的属性中使用映射时希望忽略的(字符串)PropertyNames 数组填充“忽略”属性你的对象返回给 JS。
    猜你喜欢
    • 2014-05-10
    • 2013-04-20
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2016-12-13
    • 2014-07-09
    • 2015-06-11
    相关资源
    最近更新 更多