我了解到,不是使用model.findAll而是在findAll的回调函数中编写代码,我们可以通过使用新的model.List({})来实现相同的功能。 例如,jsfiddle - > http://jsfiddle.net/CRZXH/48/ ..在这个jsfiddle示例中List实现有效,但findOne失败。
var people = new Person.List({});
return can.Component({
tag: 'people',
template: initView,
scope: {
people: people
}
})
上面的示例工作正常,最初为人们分配了空对象,但在ajax调用完成后,人员变量会自动更新列表和视图更新。
如何在findOne的情况下实现相同的目标?
var person = PersonModel.findOne({});
can.Component({
tag: 'person',
template: initView,
scope: person
})
这失败了......
我确实解决了以下问题:
var person;
PersonModel.findOne({},function(data){
person = data
});
can.Component({
tag: 'person',
template: initView,
scope: person
})
仅当我在findeOne ajax调用中添加asyn = false时才有效。
答案 0 :(得分:1)
我从http://webchat.freenode.net/ @daffl
获得了此问题的解决方案解决方案:http://jsfiddle.net/CRZXH/49/
can.Model.extend('Person', {
findOne: 'GET api/metadata',
getMetadata: function() {
var result = new Person();
Person.findOne().then(function(data) {
result.attr(data.attr(), true);
});
return result;
}
}, {});
// Person component which uses findOne
can.Component({
tag: 'person',
scope: function() {
return {
person: Person.getMetadata()
}
}
})
答案 1 :(得分:0)
1- findOne的ID是必需的
findOne({id: modelId})
2-您可以将person模型放在viewmodel(AKA组件范围)中,而不是使用can.stache插件和can.map.define插件来传递值
can.fixture({
"GET api/people":function(){
return [
{id: 1, name: "Person 1"},
{id: 2, name: "Person 2"}
];
},"GET api/people/{id}":function(request,response){
return {id: request.data.id, name: "Person "+request.data.id}
}
});
can.Model.extend('Person',{
findAll: 'GET api/people',
findOne: 'GET api/people/{id}',
},{});
can.Component.extend({
tag:'x-person',
scope:{
define:{
person:{
get:function(currentPerson,setFn){
Person.findOne({id: 2}, setFn);
}
}
}
}
});
var frag=can.view('personTmpl',{});
$('#main').html(frag);