1

我了解到,我们可以通过使用 new model.List({}) 来代替使用 model.findAll 并在 findAll 的回调函数中编写代码。例如,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 时才有效。

4

2 回答 2

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()
        }
    }
})
于 2014-09-08T20:43:59.287 回答
0

1- findOne 的 ID 是强制性的

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/

于 2014-09-08T15:43:58.260 回答