2

で動作するを構築し、RESTAdapter動作couchdbすることを確認するためにテストしています。これまでのところ問題ないようですが、テストルートには他の問題があるようです。

申し訳ありませんが、これは非常に長いので、おそらくフィドルを設定する必要があります...これまでに行ったことはありませんが、今すぐ調べます....

私は次の(関連する)ものを構築しました:

App.Thing = DS.Model.extend({
    rev: DS.attr(),
    price: DS.attr()
});

App.Things<Index>Route = Ember.Route.extend({
    model: function () {
        return this.get('store').findAll('thing');
    }
});

(私は変更ThingsRouteなしで の有無にかかわらず試しましたIndex

App.Router.map

this.resource('things', function() {
    this.route('thing', { path: ':thing_id'})
});

App.ApplicationAdapter = DS.RESTAdapter.extend

buildURL: function(type, id) {
    id = id || '_all_docs?include_docs=true';
    return this._super(type, id);
}

App.ApplicationSerializer = DS.RESTSerializer.extend

extractArray: function(store, type, payload, id, requestType) {
    root = type.typeKey;
    root = Ember.String.pluralize(root);
    newJSON = {};

    newJSON[root] = payload.rows.map(function(row) {
        return row.doc;
    });
    payload = newJSON;

    console.log(payload);
    return this._super(store, type, payload, id, requestType);
},

normalize: function(type, hash, property) {
    var json = { id: hash._id, rev: hash._rev};
    delete hash._id;
    delete hash._rev;

    for (var prop in hash) {
        json[prop] = hash[prop]; 
    }

    console.log(json);
    return this._super(type, json, property);
}

そして、このテンプレート:

<script type="text/x-handlebars" data-template-name="things/index">
    {{#each thing in things}}
        {{thing.rev}}
        {{thing.price}}
    {{else}}
        Empty.
    {{/each}}
</script>

と両方のconsole.logs は、次の完全にフォーマットされた正しい json を示しています。extractArraynormalize

Object {things: Array[3]}
Object {id: "8117701d38cf9a1112ce8ed38000064d", rev: "1-14918623fedb103cf035ff2489e0a6a1", price: 1}
Object {id: "8117701d38cf9a1112ce8ed3800006e5", rev: "1-09b1e6aa1fb391e11c90bca86daccb7a", price: 5}
Object {id: "8117701d38cf9a1112ce8ed38000144e", rev: "1-2a682bf7ce58829ad2054bb8f5fbe869", price: 4}

しかし、テンプレートがレンダリングされると、単に表示され、フックを次のようEmptyに置き換えると、次のようになります。modelThingsRoute

return {things: [{id: 1, rev: 234, price: 4}, {id: 2, rev: 235, price: 3}]};

期待どおりに動作します。そして私が定義するときafterModel

afterModel: function(things, transition) {
    console.log(things);
    console.log(transition);
}

これは次のように記録します。

Class {type: function, store: Class, isLoaded: true, isUpdating: false, toString: function…}
Transition {router: Router, promise: Promise, data: Object, resolvedModels: Object, providedModels: Object…}

そのClassオブジェクトにはこれがあります:

content: Array[3]
  0: Class
  1: Class
  2: Class

それぞれのClasses には、id私のオブジェクトに対応するフィールドがあります。

何が起こっていますか?アダプターが完全に機能しているように見えても、ルートがそのモデルを取得しないのはなぜですか?

4

2 に答える 2

1

あなたの問題はthings、テンプレートの変数が存在しないためだと思います。更新しようとしていますmodel

<script type="text/x-handlebars" data-template-name="things/index">
    {{#each thing in model}}
        {{thing.rev}}
        {{thing.price}}
    {{else}}
        Empty.
    {{/each}}
</script>

または、その変数が必要な場合は、コントローラーでエイリアスを作成できます。

App.ThingsIndexController = Ember.ArrayController.extend({
    things: Ember.computed.alias('model')
});
于 2013-10-19T19:04:23.940 に答える
0

findAll の代わりに find を使用する必要があります

于 2013-10-19T18:53:56.503 に答える