Javascript Knockout.js-尝试将JSON添加到viewmodel未定义
我已经看到了这方面的一些问题,但我仍然不知道我在这里做错了什么 我要做的是获取从服务器返回的JSON对象,如下所示: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
{
"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);