使用Ember Data,如何测试本地存储中是否已存在模型实例?
假设一个名为的Ember Data模型类型App.User = DS.Model.extend({ ... }).
someUser = App.User.find(someId)可能会也可能不会向远程服务器发出XHR,具体取决于someId本地存储中是否已存在记录.在发布XHR之前,我想首先检查本地商店是否存在这样的记录.
我在使用从后端检索到的数据填充Ember 下拉框时遇到问题.
为了这个例子,让我们说我有一个汽车列表的下拉列表.我希望用户能够选择一辆车.我想通过/cars转发并将返回数据存储在arraycontroller中来填充ember rest适配器.
例子/解决方案?
我正在扩展标准Ember示例项目(在coffeescript中)与快速/猫鼬RESTful服务器进行通信.我已成功使用推荐的POSTS通过POSTS获取所有和单个记录:
Find GET /people/123
Find All GET /people
Run Code Online (Sandbox Code Playgroud)
现在尝试通过ember-data PUT更新记录时,通过Ember适配器触发.
Update PUT /people/123
Run Code Online (Sandbox Code Playgroud)
它不起作用.
我使用Chrome开发工具分析客户端,使用console.log分析服务器端.这是我在客户端看到的.Ember-data对服务器进行PUT和OPTIONS调用.

在PUT中,我看到有效负载包含用户编辑,格式看起来正确.

响应选项卡显示了一堆废话,所以我假设问题出在服务器端.
在服务器端,当我转储请求变量时,我得到了这个.身体被接收为{post: {}},即正确的结构但没有内容.并收到正确的mongo id.

这是来自服务器路由器的堆栈跟踪:
Trace
at /home/vagrant/restl/node_modules/restgen/lib/routes.js:68:15
at callbacks (/home/vagrant/restl/node_modules/express/lib/router/index.js:161:37)
at param (/home/vagrant/restl/node_modules/express/lib/router/index.js:135:11)
at param (/home/vagrant/restl/node_modules/express/lib/router/index.js:132:11)
at param (/home/vagrant/restl/node_modules/express/lib/router/index.js:132:11)
at pass (/home/vagrant/restl/node_modules/express/lib/router/index.js:142:5)
at Router._dispatch (/home/vagrant/restl/node_modules/express/lib/router/index.js:170:5)
at Object.router (/home/vagrant/restl/node_modules/express/lib/router/index.js:33:10)
at next (/home/vagrant/restl/node_modules/express/node_modules/connect/lib/proto.js:190:15)
at Object.session [as handle] (/home/vagrant/restl/node_modules/express/node_modules/connect/lib/middleware/session.js:301:7)
at next (/home/vagrant/restl/node_modules/express/node_modules/connect/lib/proto.js:190:15)
at Object.cookieParser [as handle] (/home/vagrant/restl/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js:60:5)
at next (/home/vagrant/restl/node_modules/express/node_modules/connect/lib/proto.js:190:15)
at Object.allowCrossDomain [as handle] (/home/vagrant/restl/app.js:21:5)
at next (/home/vagrant/restl/node_modules/express/node_modules/connect/lib/proto.js:190:15)
at Object.methodOverride [as handle] …Run Code Online (Sandbox Code Playgroud) 如何处理来自商店或适配器的restAdapter错误?现在我正在使用此代码:
App.ApplicationRoute = Ember.Route.extend({
model: function(){
var self = this;
return this.store.find('item').then(function(data){
return data;
}, function (error){
console.log('error');
return [];
});
},
});
Run Code Online (Sandbox Code Playgroud)
更通用的东西会更好.谢谢
我正在使用默认的RESTAdapter和ActiveModelAdapter,我想在特定的模型中包含一个JSON对象.
例如:
App.Game = DS.Model.extend(
name: attr('string')
options: attr('raw') # This should be a JSON object
)
Run Code Online (Sandbox Code Playgroud)
读完ember-data/TRANSITION.md后.
我在示例中使用了相同的变换器:
App.RawTransform = DS.Transform.extend({
deserialize: function(serialized) {
return serialized;
},
serialize: function(deserialized) {
return deserialized;
}
});
Run Code Online (Sandbox Code Playgroud)
当我尝试创建一个Game实例模型并保存它时,POST数据中的options属性为"null"(字符串类型).
App.GamesController = Ember.ObjectController.extend(
actions:
add_new: ->
game = this.get('model')
game.set('options', {max_time: 15, max_rounds: 5})
game.save()
)
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
在Ember-Data中使用hasMany和belongsTo关系时,是否必须指定一个类,还是可以指定mixin?例如,我有一个Attachement模型,我想链接到其他一些模型.具体来说,我想将Attachements 分配给Projects和Components.我可以使用一个混合Projects和Component并用它混入如像下面的逆?
App.Attachment = DS.Model.extend({
attachedTo: DS.belongsTo('canHaveAttachments', { inverse: 'attachments'});
});
App.CanHaveAttachmentsMixin = DS.Mixin.create({});
App.Project = DS.Model.extend(App.CanHaveAttachmentsMixin, {
attachments: DS.hasMany('attachment', { inverse: 'attachedTo' });
});
Run Code Online (Sandbox Code Playgroud)
这是Ember正式支持的吗?
使用ember-data 0.0.14交易可能很简单.rollback().但现在交易消失了.还有关于如何取消记录修改的任何细节:我们只有关于如何保留记录的信息
如何修改修改?
我有一个API,通过在post请求的主体中发送JSON对象来与之交互.作为回报,在成功授权后,服务器将在其响应后的主体中使用JSON API提要进行响应.
如何通过发送JSON请求使用Ember.js接收从服务器返回的有效负载?我看到Ember Data和Ember模型允许使用标题,但它看起来不像发送POST主体的能力.
这是我需要发送服务器以便在post响应中接收JSON API的JSON示例.
{
"auth": {
"type" : "basic",
"password": "xxx",
"username": "someone"
},
"requestId" : 15,
"method": {
"name": "getUserAvailabilityAndInfo",
"params": {
"userId" : "000",
"peopleOnly" : "1"
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个Ember Data模型,我正在尝试根据async hasMany关系的属性执行计算属性.出于某种原因,它似乎永远不会重新计算.我该怎么做呢?
代码:
export default DS.Model.extend({
splits: DS.hasMany('split', { async: true }),
amount: Ember.reduceComputed('splits.@each.amount', {
initialValue: 0,
addedItem: function(accValue, split) { return accValue + split.get('amount'); },
removedItem: function(accValue, split) { return accValue - split.get('amount'); }
})
/* Neither of these work either.
amount: Ember.computed.sum('splits.@each.amount') // This doesn't work
amount: Ember.computed('splits.@each.amount', function() {
return this.get('splits').reduce(function(pValue, split) {
return pValue + split.get('amount');
}, 0);
})
*/
});
Run Code Online (Sandbox Code Playgroud)
失败的测试(预期1350,得到0):
import { test, moduleForModel } from 'ember-qunit';
import Transaction …Run Code Online (Sandbox Code Playgroud) 当前情况: 我试图找到一种方法,从组件的"didInsertElement"方法中创建特定模型的记录,并将所述数据添加到数据存储.
当前情况的原因:我将事件侦听器附加到组件HBS文件中的按钮.其中一个按钮将触发两个级联但轻微的ajax调用.这些ajax调用中的最后一个响应将决定我是否应该创建记录.
我遇到的问题:当我尝试从组件中访问这样的商店时:
var myStore = this.store
Run Code Online (Sandbox Code Playgroud)
我得到一个未定义的对象.对于那些问你,我已经在我的组件中添加了以下行:
store: Ember.inject.service()
Run Code Online (Sandbox Code Playgroud)
我已经安装了Ember-Data.
解决方案:我从大量研究中发现,与商店的互动最好通过主要途径完成.但是,如何将路径中的事件侦听器附加到组件的jquery小部件?
是否有任何解决方案不需要我将所有事件监听器代码从组件移动到路由,从而撤消ember应该提供的模块化?