Javascript Knockout.js-尝试将JSON添加到viewmodel未定义

Javascript Knockout.js-尝试将JSON添加到viewmodel未定义,javascript,json,knockout.js,knockout-3.0,Javascript,Json,Knockout.js,Knockout 3.0,我已经看到了这方面的一些问题,但我仍然不知道我在这里做错了什么 我要做的是获取从服务器返回的JSON对象,如下所示: { "firstname": "Blanchard", "lastname": "Buckner", ... } 视图模型执行AJAX调用,并且数据似乎设置正确。但是,当我试图将它传递给我的singleContact函数以绑定到视图时,什么都没有发生 我是个新手,所以我肯定我犯了一个很容易的错误,但我已经试了一段时间想弄清楚,但什么都没用 // Binds json

我已经看到了这方面的一些问题,但我仍然不知道我在这里做错了什么

我要做的是获取从服务器返回的JSON对象,如下所示:

{
  "firstname": "Blanchard",
  "lastname": "Buckner",
  ...
}
视图模型执行AJAX调用,并且数据似乎设置正确。但是,当我试图将它传递给我的singleContact函数以绑定到视图时,什么都没有发生

我是个新手,所以我肯定我犯了一个很容易的错误,但我已经试了一段时间想弄清楚,但什么都没用

// Binds json db data to each contact.
function singleContact(data) {
  var self = this;

  self.firstName = data.firstname;
  self.lastName = data.lastname;

  self.fullName = ko.computed(function() {
      return self.firstName + " " + self.lastName;    
  }, self);

  self.image = data.image;
  self.position = data.position;
  self.company = data.company;
};

function detailViewModel(contactID) {
  var self = this;

  self.contactID = ko.observable(contactID);
  self.contact = ko.observableArray([]);

  self.getContact = function(id) {
    $.ajax({
      type: 'GET',
      url: 'http://localhost:3000/contacts/' + id,
      dataType: 'json',
      success: function(data) {
        console.log(singleContact(data)); <---- Always Undefined. The data is a JSON object.
      }
    });
  }

  self.getContact(self.contactID());
};
//将json db数据绑定到每个联系人。
功能单触点(数据){
var self=这个;
self.firstName=data.firstName;
self.lastName=data.lastName;
self.fullName=ko.computed(函数(){
返回self.firstName+“”+self.lastName;
},自我);
self.image=data.image;
self.position=data.position;
self.company=data.company;
};
函数detailViewModel(contactID){
var self=这个;
self.contactID=ko.可观察(contactID);
self.contact=ko.observearray([]);
self.getContact=函数(id){
$.ajax({
键入:“GET”,
网址:'http://localhost:3000/contacts/“+id,
数据类型:“json”,
成功:功能(数据){

console.log(singleContact(data));您需要使用
new
关键字来创建singleContact对象:

var contact = new singleContact(data);
然后可以将其分配给detailViewModel上的可观察对象:

self.singlecontact(contact);

我还建议您在viewModel中使用大写Camelcase。即
DetailViewModel
,而不是使用面向对象编程时在任何其他语言中使用的
DetailViewModel

这里是一个工作示例。缺少的是您没有将创建的模型推到observableArray中。我已经展示了您可以返回一系列结果,并轻松地将其推入

函数详细信息视图模型(id){
var self=这个;
self.contacts=ko.observearray([]);
//进行ajax调用..在这里进行模拟
var results=ajax();
results.forEach(函数(结果){
自接触推(新接触(结果));
});
}
功能联系人(数据){
var self=这个;
self.firstName=data.firstName;
self.lastName=data.lastName;
self.company=data.company;
self.position=data.position;
self.image=data.image;
self.fullName=ko.pureComputed(函数(){
返回self.firstName+“”+self.lastName;
});
回归自我;
}
函数ajax(){
返回[{
名字:“Rich”,
姓氏:“Hickey”,
公司:“Cognitect”,
职位:'CTO',
图像:'http://gotocon.com/dl/photos/speakers/Rich%20Hickey2.jpg'
}, {
名字:“斯科特”,
姓:“汉斯曼”,
公司:“微软”,
职位:'建筑师',
图像:'http://www.globalnerdy.com/wordpress/wp-content/uploads/2009/09/scott_hanselman.jpg'
}];
}
$(函数(){
应用绑定(新的DetailViewModel());
});

,
关于

你也可以发布你的标记,这样我就可以看到你的绑定是如何指定的了吗?Andrew,已经添加了。谢谢你看一看!@AndrewMount。本教程没有使用这种大小写:。我也找不到使用这种大小写的文档。对象应该是驼峰大小写。用于新对象的函数应该是驼峰大小写。我在进行了编辑。视图不在那里。很公平,在他们关于观察对象的文档中,他们的视图模型是驼峰式的,但我确实看到他们混合使用了上驼峰式的链接。我也不知道你没有看到标记。我将删除我的注释。@andremount请解释你所说的混合的意思。视图模型函数是上驼峰式的d视图模型是驼峰式的。如果你看这里:它们使用下驼峰,因为它们实际上没有构造实例。我匆匆看了一眼,把脚放在嘴巴所在的地方。@AndrewMount在该文档中,它们只是视图模型,所以它们是驼峰式的。如果一个函数用于ViewModel类型,那么函数名将是上驼峰式的案例
self.singlecontact(contact);