使用AJAX内部函数绑定可观察数组

时间:2015-09-04 12:49:37

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

我正在使用Knockout.js。我有这样的功能:

function deviceGroupItem(item) {
    this.DeviceGroupName = item.DeviceGroupName;
    this.groupDevicesVisible = ko.observable(false)
    this.groupDevicesArray = ko.observableArray();
    this.deviceGroupClick = function () {
        if (this.groupDevicesVisible() == false) {
            this.groupDevicesVisible(true)
            $.ajax({
                url: returnServer() + '/api/Mobile/getRoomDevices?accessToken=' + localStorage.getItem('Token'),
                type: "GET",
                dataType: "json",
                success: function (data) {
                    this.groupDevicesArray()($.map(data, function (item) {
                        return new roomDeviceItem(item);
                    }))
                },
                error: function () {

                }
            })
        } else {
            this.groupDevicesVisible(false)
        }
    }
    return this;
}

问题是,当我正在尝试绑定时:

this.groupDevicesArray = ko.observableArray();

使用:

this.groupDevicesArray()($.map(data, function (item) {
                        return new roomDeviceItem(item);
                    }))

我收到错误" this.groupDevicesArray不是函数"。老实说,我不知道如何以正确的方式做到这一点。你知道我怎么能实现这个目标吗?

2 个答案:

答案 0 :(得分:1)

问题在于你在函数this中引用了deviceGroupClick的可观察数组,因为this引用当前上下文而不存在。

  

This技术依赖于当前闭包,这是一个伪变量   可能会动态地从范围到范围不同。

<强>视图模型:

function roomDeviceItem(data) {
    this.room = ko.observable(data.room)
}

function deviceGroupItem() {
    var self=this; //Assign this to self & use self everywhere
    self.groupDevicesArray = ko.observableArray();
    self.deviceGroupClick = function () {
        $.ajax({
            url: '/echo/json/',
            type: "GET",
            dataType: "json",
            success: function (data) {
                data = [{
                    'room': 'One'
                }, {
                    'room': 'Two'
                }]
                self.groupDevicesArray($.map(data, function (item) {
                    return new roomDeviceItem(item);
                }))
            }
        });
    };
};
ko.applyBindings(new deviceGroupItem());

工作样本 here

如果您正在寻找this的解决方案,您需要使用bind(this)来获取外部封闭检查 here

答案 1 :(得分:0)

尝试

this.groupDevicesArray($.map(data, function (item) {
  return new roomDeviceItem(item);
}));

groupDevicesArray是observableArray,$.map返回一个数组。