canjs findOne отсроченный
Я узнал, что вместо того, чтобы использовать model.findAll и писать код в функции обратного вызова findAll, мы можем достичь того же, используя new 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 переменная people обновляется списком и просматривает обновления самостоятельно.
Как добиться того же в случае 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
})
Это работает, только если я добавляю asyn = false в вызове findeOne ajax.
2 ответа
Я получил решение этой проблемы от 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- идентификатор для findOne обязателен
findOne({id: modelId})
2- Вы можете поместить модель человека в модель представления (область действия 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);
Вот скрипка http://jsfiddle.net/cherif_b/egq85zva/