0

我正在使用 knockout.js 的映射函数来映射我从服务器端 asp.net 应用程序接收到的 json 对象。使用 Chrome 的调试器,我可以看到接收到的 json 对象很好,但是当我使用 ko.mapping.fromJS 创建一个可观察对象时,所有内部可观察数组都显示为长度 0。在 QCTest 中有多个数组。

var testDefJSON = getTestDefJSON();
var ViewModel = function () {
    var self = this;
    self.QCtest = ko.mapping.fromJS(testDefJSON);
    self.hasBuiltNewGroup = ko.observable(false);
    self.selectedOp = ko.observable();
    self.selectedUom = ko.observable();
    self.addTestGroup = function () {
        show_modal("createGroupModal");
    };
    self.saveTest = function () {
        var jsData = ko.toJS(ViewModel);
        var json = JSON.stringify(jsData);
        $.ajax({
            type: 'POST',
            url: '/Test/SaveTest',
            async: false,
            data: json,
            contentType: "application/json",
            success: function (result) { alert(result) },
            error: function () { alert("failed to post test data"); }
        });
    };
    self.delItems = function () {
        alert(self.QCtest.QCTestGroups.length);
    };
    self.closeItemModal = function () {
        ViewModel.hasBuiltNewGroup(false);
        close_modal();
    };
    self.createNewGroup = function () {
        ViewModel.hasBuiltNewGroup(true);
    };
    self.addNewTestItem = function () {
        alert("Adding new test item button works");
    };
};
var viewModel = new ViewModel();
ko.applyBindings(viewModel);

当在内部数组上使用 foreach/template 时,我的所有 UI 元素都会显示出来。然而,当我单击我的 delItems 按钮时,会弹出警报并指出内部数组 QCTestItems 的长度为 0,而它应该至少为 1(但是数组中有许多测试项目)。

当您按下 delItems 按钮时,我需要能够删除检查的项目。为此,我需要访问该数组中的元素,并且由于它的长度为 0,因此很难做到这一点。

任何帮助将非常感激

编辑:

改为self.delItems = function () { alert(self.QCtest.QCTestGroups.length); }; _self.delItems = function () { alert(self.QCtest.QCTestGroups().length); };

现在它可以工作了

4

1 回答 1

0

映射插件会将您的 JSON 转换为 Observables。Observable(包括 ObservableArray)是一个函数,因此请确保使用 () 形式访问实际值:

alert(self.QCtest().QCTestGroups().length);

这是一个要演示的小提琴:http: //jsfiddle.net/jearles/cH7h3/

加载选项后单击按钮。显示的警报显示了两个长度值,一个直接访问数组(将显示长度为0),另一个访问内部数组(显示实际长度为2)。

于 2012-11-20T00:23:04.887 回答