有人告诉我,为了不一直提出请求,可以使用.all()方法加载存储在商店中的数据.但是Ember如何处理缓存?我有一些问题.
你如何控制缓存?什么时候使用.find()和.all().你使用.find()然后.all()吗?多长时间?
.all()是否有一些到期日期,以便在一段时间后它可以发出新的请求?或者它使用本地存储,以便我必须手动清除它?
假设我有一些数据,我想每周只刷一次?我该怎么办呢?现在,每次我进入或重新访问同一路线时,都会发出新请求.我怎么能避免这个?
这个截屏视频:http://www.embercasts.com/episodes/getting-started-with-ember-model用于Ember.model创建这样的人物模型:
App.Person = Ember.Model.extend({
name : Ember.attr()
})
Run Code Online (Sandbox Code Playgroud)
该文档给出了用这个例子Ember.Object
App.Person = Ember.Object.extend({
say : function(thing) {
alert(thing);
}
});
Run Code Online (Sandbox Code Playgroud)
此外,在定义模型部分下,给出了该示例使用的示例DS.model
App.Person = DS.Model.extend({
firstName: DS.attr('string'),
lastName: DS.attr('string'),
birthday: DS.attr('date'),
fullName: function() {
return this.get('firstName') + ' ' + this.get('lastName');
}.property('firstName', 'lastName')
});
Run Code Online (Sandbox Code Playgroud)
这三者之间有什么区别以及何时使用哪种?
我正在尝试获取belongsTo ID而不获取实际记录.我的JSON API返回belongsTo关系的ID.
我有以下型号
App.Recipe = DS.Model.extend(
title: DS.attr()
ingredients: DS.hasMany('ingredient', async: true)
)
App.Ingredient = DS.Model.extend(
recipe: DS.belongsTo('recipe')
product: DS.belongsTo('product', async: true)
)
App.Product = DS.Model.extend(
title: DS.attr()
)
Run Code Online (Sandbox Code Playgroud)
这是我的路线:
App.RecipeIndexRoute = Ember.Route.extend(
model: (args) ->
@store.find('recipe', args.recipe_id)
)
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
我正在尝试在此控制器中找到产品ID.
App.RecipeIndexController = Ember.ObjectController.extend(
hasRecipeInCart: null
actions:
toggleCart: ->
@content.get('ingredients').then((ingredients) =>
# how do I get product id here, without lookup up the product relation?
# this 'get' makes Ember call: /api/v1/products/1
# I simply want the product ID …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
var msg = this.store.createRecord({text:'first title', createdAt: "2015-06-22T20:06:06+03:00" })
this.get('model.content').pushObject(msg);
msg.save();
Run Code Online (Sandbox Code Playgroud)
我们创造了新纪录.然后将其推入模型中进行显示.它在1.9版本中运行良好,但在将其升级到最新的1.13后,它会中断并显示此错误:
TypeError:internalModel.getRecord不是函数
经过一些研究,我得出了这个解决方案
this.get('messages.content').unshiftObject(message.internalModel);
Run Code Online (Sandbox Code Playgroud)
这部分有帮助.现在我有两个问题:
我有以下两个编辑和新路线:
WZ.ExercisesNewRoute = Em.Route.extend
model: ->
WZ.Exercise.createRecord()
deactivate: ->
@_super.apply this, arguments
@get('currentModel.transaction').rollback()
WZ.ExercisesEditRoute = Em.Route.extend
model: (params) ->
WZ.Exercise.find(params.exercise_id)
serialize: (params, options) ->
exercise_id: params.get('id')
deactivate: ->
@_super.apply this, arguments
tx = @get('currentModel.transaction')
tx.rollback() if tx
Run Code Online (Sandbox Code Playgroud)
我想知道在每次取消激活时应该使用正确的代码,以便在用户不保存,保存或其他任何情况下,存储处于正确的状态.
目前,如果我路由到编辑路线,然后直接到新路线而不保存,我收到以下错误:
未捕获错误:
willSetProperty在状态rootState.deleted.saved中尝试处理事件.使用{reference:[object Object]调用,存储:,name:name}
在我的ember-data适配器中,我使用这一行来序列化我的模型
var data = record.serialize();
Run Code Online (Sandbox Code Playgroud)
但我注意到我的模型有日期类型......
App.Foo = DS.Model.extend({
start: DS.attr('date')
});
Run Code Online (Sandbox Code Playgroud)
...会将这样的日期发布到我的REST api中
星期六,2013年3月2日22:15:00 GMT
但是我需要更友好的api友好的东西,比如yyyy-mm-dd或mm/dd/yyyy
ember-data是否提供了一个钩子来改变通过线路发送日期的方式?
我假设不是因为这是ember-data rev 11中serialize方法的实际返回行
return dayOfWeek + ", " + dayOfMonth + " " + month + " " + utcYear + " " + pad(utcHours) + ":" + pad(utcMinutes) + ":" + pad(utcSeconds) + " GMT";
Run Code Online (Sandbox Code Playgroud)
更新
我还打开了一个关于ember-data的问题,看看为什么选择这种格式开始
任何使用ember数据推荐的示例应用程序?理想情况下使用Rails后端和模型关联.
我正在构建一个具有如下布局的应用程序.
预览http://sunshineunderground.kr/problem-01.png
我想创建一个新帖子,所以我按下了"新帖子按钮",它把我带到了"帖子/新帖".
My PostsNewRoute如下(我按照这里描述的方法)
App.PostsNewRoute = Ember.Route.extend({
model: function() {
// create a separate transaction,
var transaction = this.get('store').transaction();
// create a record using that transaction
var post = transaction.createRecord(App.Post, {
title: 'default placeholder title',
body: 'default placeholder body'
});
return post;
}
});
Run Code Online (Sandbox Code Playgroud)
它会立即创建新记录,更新帖子列表,并显示新帖子的表单.
预览http://sunshineunderground.kr/problem-02.png
现在我有两个问题.
一个是帖子列表的顺序.
我预计新帖子将位于列表的顶部,但它位于列表的底部.
我使用rails作为我的后端,并将Post模型顺序设置为
default_scope order('created_at DESC')
Run Code Online (Sandbox Code Playgroud)
旧帖子位于现有帖子的下方.但新创建的不是.(尚未承诺后端)
另一个是当我点击列表中创建的帖子时
我可以在帖子列表中点击我新创建的帖子.它带我到一个带URL的帖子页面
/posts/null
Run Code Online (Sandbox Code Playgroud)
这是我必须阻止的非常奇怪的行为.
我认为会有两种解决方案.
当我点击"新发布按钮"创建一条记录并立即提交服务器,当服务器成功保存我的新记录后,刷新帖子列表并进入新创建的帖子的编辑模式.
或者,当我点击PostsNewView中的"提交"按钮时,最初将Route的模型设置为null并创建记录.
或者只显示属性为的帖子
'isNew' = false, 'isDirty' = false,
Run Code Online (Sandbox Code Playgroud)在列表中..
但遗憾的是,我不知道从哪里开始......
对于解决方案1,我完全迷路了.
对于解决方案2,我不知道如何将输入表单中的数据绑定到尚未存在的模型.
对于解决方案3,我完全迷路了.
请帮我!这将是余烬的预定方式?
(我听说Ember打算为每个开发人员使用相同的解决方案)
更新
现在我正在使用解决方案3并仍然有订购问题.这是我的帖子模板代码. …
我一直在四处寻找,我找不到任何最新的ember(1.0.0-rc.1)和ember-data(修订版11)也使用socket.io的例子.我尝试过这样的事情.
App.ApplicationRoute = Ember.Route.extend({
setupController: function(controller, data) {
var socket = io.connect(),
self = this;
socket.on('apartment/new', function(apartment) {
var apt = App.Apartment.createRecord(apartment);
self.controllerFor('apartments').pushObject(apt);
});
}
});
Run Code Online (Sandbox Code Playgroud)
这实际上将创建一个新的模型类,它将对象推送到控制器,并创建一个新的li但值不会呈现.
<ul class="list-view">
{{#each apartment in controller}}
<li>
{{#linkTo 'apartment' apartment }}
<span class="date">{{date apartment.date}}</span>
{{apartment.title}}
{{/linkTo}}
</li>
{{/each}}
</ul>
Run Code Online (Sandbox Code Playgroud)
这与运行循环有关吗?如何强制渲染值?或者有更好的方法吗?
我的模型定义为:
App.Answer = DS.Model.extend({
name: DS.attr('string'),
layoutName: DS.attr('string')
});
App.Question = DS.Model.extend({
name: DS.attr('string'),
answers: DS.hasMany('answer', {async: true})
});
Run Code Online (Sandbox Code Playgroud)
我有一个组件,允许删除和添加问题模型的答案.该组件带有"应用"和"取消"按钮,当用户单击"取消"时,我希望还原所有更改(添加/删除答案).目前回滚不起作用,我在使用rest适配器时尝试了model.reload(),但这对我来说也不起作用.知道如何在这种情况下进行回滚吗?
当使用其余的适配器时,我几乎陷入了这里指出的问题:使用HasMany的EmberJS取消(回滚)对象
谢谢,迪
更新:
由于我无法以预期的方式执行回滚,因此我执行了以下步骤:
1) get all the answers back from the server
2) remove answer association from the question
3) manually add answer association to the question model from data received from server
Run Code Online (Sandbox Code Playgroud)
这似乎运作良好但令人遗憾的是我得到了一个我无法摆脱的错误.
这是更新进展的jsbin:http://jsbin.com/uWUmUgE/2/
在这里,您可以创建新的答案,然后将其附加到问题并进行回滚.但是,如果您按照这些步骤操作,您将看到我面临的问题:
1) delete an answer
2) add an answer
3) perform rollback
4) add an answer
Run Code Online (Sandbox Code Playgroud)
它会抛出此错误:
错误:didSetProperty在状态root.deleted.uncommitted中尝试处理事件.用{name:position,oldValue:1,originalValue:1,value:2}调用.
我将非常感谢您提供的任何帮助. …