我正在使用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不是函数"。老实说,我不知道如何以正确的方式做到这一点。你知道我怎么能实现这个目标吗?
答案 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
返回一个数组。