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/

Другие вопросы по тегам