【问题标题】:knockoutjs ko.toJs (ko.toJSON) doesn't workknockoutjs ko.toJs (ko.toJSON) 不起作用
【发布时间】:2012-11-26 15:10:11
【问题描述】:


我正在使用 knockoutjs 版本 2.2.0 并且有以下情况:
Javasript 代码
这是我的 3 个模型的 javascript 代码:“Tab1”、“Tab2”和“viewModel”

var CustomExport = {
    Tab1: function () {
        this.tab1Array = ko.observableArray([
            {name: "Tab1 Item1"},
            {name: "Tab1 Item2"},
            {name: "Tab1 Item3"}
        ]);
    },
    Tab2: function () {
        this.tab2Array = ko.observableArray([
            {name: "Tab2 Item1"},
            {name: "Tab2 Item2"},
            {name: "Tab2 Item3"}
        ]);
    },
    viewModel: function () {
        this.myTab1 = new CustomExport.Tab1();
        this.myTab2 = new CustomExport.Tab2();
        this.grabData = function(){
            alert(ko.toJS(CustomExport.viewModel));
        };
    }    
}

ko.applyBindings(new CustomExport.viewModel());


所以,一般来说,我有 2 个模型,我想将这些模型中的所有数据作为 json 对象抓取到一个“viewModel”模型中,grabData 函数应该提醒我模型数据。

这是我的 HTML 代码

<div data-bind="with: myTab1">
    <ul data-bind="template: {name: 'tabTmpl', foreach: tab1Array}"></ul>
</div>
<br/>
<div>------------------------------------------</div>
<br/>
<div data-bind="with: myTab2">
    <ul data-bind="template: {name: 'tabTmpl', foreach: tab2Array}"></ul>
</div>
<br/>
<input type="button" data-bind="click: grabData" value="Grab all data from Models" />


<script id="tabTmpl" type="text/html">
    <li>
        <div data-bind="text: name"></div>
    </li>
</script>


问题如下:
单击“Grab all data from the models”按钮,我应该会收到一个警报,其中必须包含来自 2 个模型(“Tab1”、“Tab2”)的数据作为 json 对象,但目前我收到以下警报消息:

function () {
    this.myTab1 = new CustomExport.Tab1();
    this.myTab2 = new CustomExport.Tab2();
    this.grabData = function(){
        alert(ko.toJS(CustomExport.viewModel));
    };
}


另外,我已经在我的 jsFiddle Click here to see an example 中创建了它


知道我做错了什么吗?

【问题讨论】:

  • CustomExport.viewModel 不是对 viewModel 的实际引用,将其替换为 this 因为这是实际的 viewmodel

标签: knockout.js


【解决方案1】:

您应该使用this 而不是CustomExport.viewModel:

this.grabData = function(){
    console.log(ko.toJS(this));
};

但最好为this创建闭包:

function () {
    var self = this;
    self.myTab1 = new CustomExport.Tab1();
    self.myTab2 = new CustomExport.Tab2();
    self.grabData = function(){
        alert(ko.toJS(self));
    };
}

【讨论】:

  • 更好的是把grabData移到原型声明中
  • 谢谢你们(Anders 和 Artem),你们真的帮了我大忙!
猜你喜欢
  • 1970-01-01
  • 2013-01-30
  • 2018-06-18
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 2017-04-19
相关资源
最近更新 更多