1

アカウントがソーシャルメディアにメッセージを投稿できるようにするアプリケーションに取り組んでいます。最初のメッセージをEmberデータストアに保存しようとしていますが、機能していないようです。問題は、それもエラーではないので、何が起こっているのかわからないということです。設定は次のとおりです。

モデル

Social.Account = DS.Model.extend({
    username: DS.attr('string'),
    messages: DS.hasMany('Social.Message')
});

Social.Message = DS.Model.extend({
    user_id: DS.attr('number'),
    text: DS.attr('string'),
    accounts: DS.hasMany('Social.Account'),
    posts: DS.hasMany('Social.Post')
});

Social.Post = DS.Model.extend({
    created: DS.attr('date'),
    text: DS.attr('string'),
    message: DS.belongsTo('Social.Message')
});

データ

Social.Account.FIXTURES = [{
    id: 1,
    username: "commadelimited",
    messages: [1, 2]
}];

Social.Message.FIXTURES = [{
    id: 1,
    user_id: 1,
    text: 'This is message #1 sent by account #1',
    accounts: [1],
    posts: [1]
}, {
    id: 2,
    user_id: 1,
    text: 'This is message #2 sent by account #1',
    accounts: [1],
    posts: [2]
}];

Social.Post.FIXTURES = [{
    id: 1,
    created: "5 minutes ago",
    text: 'This is post #1 sent by account #1, tied to message #1'
}, {
    id: 1,
    created: "5 minutes ago",
    text: 'This is post #2 sent by account #1, tied to message #2'
}];

Social.NewPostViewのコンテキストでは、送信メソッドを呼び出すボタンがあります

Social.NewPostView = Ember.View.extend({
    tagName: 'div',
    submit: function(e) {
        msg = Social.Message.createRecord({
            id: 1,
            user_id: 1,
            text: 'This was a created message',
            created: "2013-02-27 13:09:22",
            accounts: [1],
            posts: [1]
        });
        console.log('done');
    }
});

ユーザーがボタンをクリックしたときにアラートボックスをトリガーできるので、メソッドが起動していることがわかります。ここでcreateRecord呼び出しをハードコーディングしたことがわかります(ただし、アプリではユーザーが入力したデータを使用しています)。ログステートメントがコンソールに表示されますが、UIが期待どおりに変更されていません。さらに、ユーザー1のアカウントオブジェクトをイントロスペクトすると、長さが0になります。

Social.Account.find().objectAt(0).get('messages').get('length')

コンソールでこのステートメントを実行すると、何かが表示されます。

Social.Message.createRecord({ user_id: 1, text: 'This was a created message', created: "2013-02-27 13:09:22", accounts: [1], posts: [1] })

しかし、それは複雑なオブジェクトであり、実際に何であるかはわかりません。私は@toranbのcomplex-ember-data-exampleプロジェクトに基づいてコードを作成していますが、同等のようです。私は何か間違ったことをしていると確信していますが、それが何であるかはわかりません。すべての入力が評価されます。

更新1

送信する前にログを記録Social.Message.find().get('length')すると、0になります。送信を押すと、すぐに同じログステートメントを実行して次のようになります。

4
Uncaught Error: Attempted to handle event `loadedData` on <Social.Message:ember427:1> while in state rootState.loaded.created.uncommitted. Called with undefined

これは、メッセージが実際に作成されているが、UIに表示されていないことを示しています。私の次のステップは何でしょうか?

4

1 に答える 1

2

idレコードを作成するときに設定します。私はFixtureAdapterに精通していませんが、これはどのような場合でも良い考えとは思えません。

アップデート:

サンプルプロジェクトを試してみたところ、idを呼び出すときにを設定することでバグを再現することができましたcreateRecord

したがって、代わりに次のコードを使用してください。

Social.NewPostView = Ember.View.extend({
  tagName: 'div',
  submit: function(e) {
    msg = Social.Message.createRecord({
//      id: 1,
        user_id: 1,
        text: 'This was a created message',
        created: "2013-02-27 13:09:22",
        accounts: [1],
        posts: [1]
    });
    console.log('done');
    }
});

フィクスチャにID1のレコードがすでにあります。

更新2:

この問題を実証し、より良いエラーメッセージを表示するためのオープンPRがあります

https://github.com/emberjs/data/pull/770

于 2013-02-28T23:27:55.737 に答える