2015-09-04 91 views
0

我使用Knockout.js。我有这样的功能:使用AJAX内部函数绑定可观察数组

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

试试这个: this.groupDevicesArray(ko.utils.arrayMap(data,function(item){ return new roomDeviceItem(item); });或this.groupDevicesArray($。map(data,function(item){ return new roomDeviceItem(item); })) –

+0

谢谢你的回答,但依然如此。 – Shagohad

回答

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

+0

我找到了一个解决方案,但这也可以,所以谢谢你的帮助! – Shagohad

0

尝试

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

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

+0

谢谢你的回答,但问题仍然是一样的。 – Shagohad

+1

jsfiddle会帮助。 – Dandy

相关问题