1

Day 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. 在我createRecordsApp.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我正在使用sortProperties的. 我目前的解决方案是在更新模型时暂时关闭。再次感觉很hacky,关于正确方法的建议?setordersortProperties

=== 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 方法中的索引 Route

    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 回答