【问题标题】:how to access observable arrays in knockout using mapping funcion如何使用映射函数在淘汰赛中访问可观察数组
【发布时间】:2012-11-08 00:15:51
【问题描述】:

我正在使用 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/模板时,我的所有 UI 元素都会显示出来。然而,当我单击我的 delItems 按钮时,会弹出警报并指出内部数组 QCTestItems 的长度为 0,而它应该至少为 1(但数组中有许多测试项)。

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

任何帮助将不胜感激

编辑:

已更改self.delItems = function () { alert(self.QCtest.QCTestGroups.length); };self.delItems = function () { alert(self.QCtest.QCTestGroups().length); };

现在可以了

【问题讨论】:

    标签: javascript knockout.js knockout-mapping-plugin


    【解决方案1】:

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

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

    这里有一个小提琴来演示:http://jsfiddle.net/jearles/cH7h3/

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

    【讨论】:

    • 谢谢,现在可以通过 observable 中正确数量的元素发出警报。我将在添加 () 的情况下测试所有其他内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2017-08-11
    • 2013-03-12
    • 2015-03-20
    • 2015-10-05
    • 1970-01-01
    相关资源
    最近更新 更多