canjs findOne推迟

时间:2014-09-08 01:55:00

标签: canjs canjs-model

我了解到,不是使用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时才有效。

2 个答案:

答案 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);

这是小提琴http://jsfiddle.net/cherif_b/egq85zva/