1

我在让 foreach 循环在 KnockOut.js 中工作时遇到问题,即使我尝试让代码抛出错误,它也不会。就好像它根本没有尝试绑定到表一样。

var History = function (data) {
    this.Average = ko.observable(data.Average);
    this.Count = ko.observable(data.Count);
};

var DataSource = function (data) {
    var convertData = function (array) {
        return $.map(data.Data, function (option) {
            return new History;
        });
    };

    this.Data = ko.observableArray(this.convertData());

    return {
        'Data': this.Data
    };
};

var dataMappingOptions = {
    create: function (options) {
        return new DataSource(options);
    }
};

var dataModel = function () {
    this.source = ko.mapping.fromJS({ 'Data': [], 'Percentage': 0 });
};

currentViewModel = new dataModel();
ko.applyBindings(currentViewModel);

我已经消除了很多复杂性,因为其他一切都有效。基本上,我使用 Knockout.Mappings 将 AJAX 响应映射到这些对象并为计算字段添加函数。这是似乎忽略了我所做的一切的 HTML;它会显示,但没有任何绑定。

<table>
    <thead>
        <tr>
            <th>Average</th>
            <th>Frequency</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: kjhkjh">
        <tr>
            <td data-bind="text: $data.Average()"></td>
            <td data-bind="value: $data.Average"></td>
            <td data-bind="text: $data.Average"></td>
            <td data-bind="value: $data.Average()"></td>
            <td>Test</td>
        </tr>
    </tbody>
</table>

由于kjhkjh对象没有绑定,我认为它会引发错误,但事实并非如此。即使我把source.Data它放进去也无济于事;它只显示静态表,没有任何东西绑定到它。

更新:为了从 Javascript 中的任何内容中获取价值,我必须使用类似这样的东西:

console.log(currentViewModel.source.Data()[11].Average());
4

2 回答 2

1

这部分似乎不正确。您在同一个语句中有两个回报。尝试删除return之前$.map(

var convertData = function (array) {
    return $.map(data.Data, function (option) {
        return new History;
    });
};

也可能是您正在引用对象的this私有方法。从这里删除:convertData()DataSourcethis

ko.observableArray(this.convertData());
于 2013-01-09T16:44:53.347 回答
0

我遇到的错误是由我的 Knockout 模型在页面上的放置引起的。一旦我移动了引用下面的 JS 文件的脚本标记,该表所在的位置就可以正常工作。这就是为什么除了这段摘录之外所有页面都能正常工作的原因。这部分是因为我将它作为一个全局变量作为页面的多个部分和几个需要引用它的 JS 文件。

话虽如此,Stockedout 确实指出了我能够改进代码的一些方法。

于 2013-01-15T19:43:12.057 回答