1

model.findAll を使用して findAll のコールバック関数にコードを記述する代わりに、new model.List({}) を使用して同じことを達成できることを学びました。たとえば、jsfiddle --> http://jsfiddle.net/CRZXH/48/ .. この jsfiddle の例では、リストの実装は機能しますが、findOne は失敗します。

   var people = new Person.List({});

        return can.Component({
            tag: 'people',
            template: initView,
            scope: {
                people: 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
    })

これは、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 に答える