我正在使用ember-data作为我的一个项目,我有一个问题围绕着污染对象的可能性,然后故意将其状态再次设置为清理 - 而不是提交更改.场景是这样的:
假设我已经获取了一个对象,banana = App.Fruit.find('banana');并且它描述了"黄色水果!".使用XHR长轮询(或WebSockets),我可能会收到对象的更新版本,因为另一个用户已将描述更改为"美味的黄色水果!" 在我取出原始对象后的任何给定时间点.
然后,我想要做的是更新对象以反映新接收的数据.为此,我尝试了不同的方法:
我试过打电话App.Store.load(App.Fruit, new_data);.首先,这种方法不起作用,其次,这不是我想要的.我本可以对对象进行未经提交的更改,在这种情况下,放弃那些(假设load()调用会覆盖它们)是不可取的.
我已经尝试循环遍历新数据,调用.set()- 如下所示:banana.set('description', new_data.description);- 以便用新数据更新对象属性(适用时=不脏).这有效,但它使物体处于脏污状态.
为了使对象再次清理/更新 - 并且没有适配器提交更改! - 我看了一下物体穿过的状态.这些(至少):
rootState.loaded.saved状态..set()属性将其推送到rootState.loaded.updated.uncommitted状态.App.store.commit();将对象返回到rootState.loaded.saved状态.因此,我试图对象状态手动设置为saved步骤2之后,如下所示:banana.get('stateManager').goToState('saved');.
但是,这不起作用.下次商店因任何其他原因而提交时,此操作会产生inFlightDirtyReasons未定义错误.
我的问题是:如何再次手动将脏污物体的状态更改为清洁(保存)?
新的Ember.js路由器改变了很多东西.我已经迁移了大部分内容,但是有一个用例我似乎无法适应Ember.js的做事方式.
说我有一些带有控制器的应用程序.其中一些控制器属于我的路线App.Router,其中一些不属于我的路线I18nController.这是一个非路由器控制器,可确保通过Handlebars帮助程序在整个应用程序中翻译内容.
我也有一个App.UserController有App.User记录的content.
以前,我是能够建立之间的绑定App.I18nController,并App.UserController通过比较难看localeBinding: 'App.router.userController.content.locale',让我随时定位时读取用户的语言环境.
但是,使用新的路由器,这已不再可能.
我的问题是:我应该如何使用新路由器设置此绑定?
我正在使用Ember.js和Handlebars.js进行我正在进行的项目.服务器端是Node.js + express,我使用了Jade模板引擎.
现在,每当我想将动作绑定到DOM元素时,我都会使用Ember.js的{{action}}属性.目前,这是我的代码在Jade中的样子:
script(type='text/x-handlebars', data-template-name='frontpage')
div.logo(''='{{action goToFrontpage}}')
Run Code Online (Sandbox Code Playgroud)
上面的确有效,但是,这''='{{action goToFrontpage}}'部分看起来有些晦涩难懂.
有没有其他方法这样做?结合Ember.js,Handlebars.js和Jade时,也许是最好的做法?