1

2 日目 ember.js の学習...

ドラッグ可能/並べ替え可能なタイルの位置をローカル ストレージに保存する必要があるオフライン アプリで作業しています。既存のデータがない場合は、フィクスチャから読み込んで保存します。

使用: ember 1.0.0-pre4、ember-data rev11、ember-localstorage-adapter、jQ 1.9、jQ UI 1.9 https://github.com/rpflorence/ember-localstorage-adapter

それは機能していますが、私は少し初心者です。きれいではないと感じており、コミュニティのアドバイスを利用できます。 http://jsfiddle.net/Nsbcu/4/

質問

  1. DS.Storeロード済みで空かどうかを確認する適切な方法は何ですか? 直視する私の方法は、localstorage正しく感じられませんでした。

  2. 私がそれらをコミットする必要createRecordsがあるApp.Tile.DEFAULTSと感じた後、エラーがスローされます。既知のデフォルトをコミットする必要はありませんが、エラーの原因と、適切にコミットする方法に興味があります。また、 App.ready() コールバックはデフォルトをロードするのに適切な場所ですか? localstorageが空の場合にのみエラーが発生します

    Uncaught Error: Attempted to handle event loadedData on <App.Tile:ember231:1> while in state rootState.loaded.created.inFlight. Called with undefined

  3. TilesController私が使用している では、sortPropertiesjQ UI Sortable が DOM を変更し、Ember がset新しいorder. sortProperties私の現在の解決策は、モデルの更新中に一時的にオフにすることです。繰り返しますが、これはハッキーに感じます。これを行う適切な方法についての提案はありますか?

=== 2月3日編集 ===

非同期コミットを行うと、質問 2 の最初のエラーは回避されます。

App.TilesRoute = Ember.Route.extend({
    model: function() {
        return App.Tile.find();
    },
    setupController: function(controller) {
        if (localStorage.getItem('fusion-emberjs') == null) {
            App.Tile.DEFAULTS.forEach(function(item) {
                App.Tile.createRecord(item);
            });

            // Commit async, else generates error
            var _this = this;
            setTimeout(function() {
                _this.store.commit();
            }, 1);
        }
    }
});
4

1 に答える 1

0
  • アプリケーション内に初期コードを配置するか、setupController メソッド内にインデックス ルートを配置します。

    if (localStorage.getItem('fusion-emberjs') == null) {
        App.Tile.DEFAULTS.forEach(function(item) {
            App.Tile.createRecord(item);
        });
    
        //*** WARNING: Generates Error ***/
        App.Tile.find().get('store').commit();
    }
    
  • App.Tile.find().get('store').commit();コードをルート内に移動したら、ルートApp.store.commit()内で置き換えます

  • デフォルトのトランザクションを使用する代わりに、独自のトランザクションを作成します。ストアに直接電話をかけるたびに、デフォルトのトランザクションを使用します。この方法でトランザクションを作成できます

var transaction = App.store.transaction()
transaction.createRecord(App.Foo);
transaction.commit()
transaction.rollback();
  • App.store への呼び出しは、ストアが既に作成されていることを前提としています。現時点では、DS.Store. 代わりに試す
App.Store = DS.Store.create({
  revision: 11,
  adapter: 'App.LSAdapter'
});
  • 純粋にスタイリングやアニメーションのためでない限り、ルーターでイベント処理やトランザクション管理を行うことをお勧めします。その場合、ビューは適切な場所です。すべてのアセット (コントローラー、ルート、モデル、ビュー) 間の通信を調整するルーターが好きです

  • 覚えておくべき良いパターンは、ビューがコントローラーとのみ対話すること、コントローラーがモデルへの単なるプロキシであること、ルーターがコントローラー間の通信を調整し、ルートを管理することです。

于 2013-02-02T05:25:57.253 に答える