Sideloading正在我们的应用程序中用于hasMany关系,但我无法让它为belongsTo关系工作.我正在尝试使用记录的DS.RESTAdapter.configure()方法,但这似乎没有任何影响.我得到的错误是Uncaught Error: assertion failed: Your server returned a hash with the key occasions but you have no mapping for it.
请注意,我们不需要指定hasManysideload映射,因为该请求才有效.App.Occasion.find();工作良好.App.Reminder.find();抛出错误.
楷模
App.Reminder = DS.Model.extend(
occasion: DS.belongsTo('App.Occasion')
...
)
App.Occasion = DS.Model.extend(Ember.Validations,
reminders: DS.hasMany('App.Reminder')
...
)
Run Code Online (Sandbox Code Playgroud)
Store.js.coffee
DS.RESTAdapter.configure('App.Occasion',
sideLoadAs: 'occasions'
)
App.Store = DS.Store.extend(
revision: 11
adapter: DS.RESTAdapter.create()
)
Run Code Online (Sandbox Code Playgroud)
JSON(用于场合)
{
reminders: [{},...],
occasions: [{reminders: [1,2,...]},...]
}
Run Code Online (Sandbox Code Playgroud)
JSON(用于提醒)
{
reminders: [{occasion_id: 1},...],
occasions: [{},...]
}
Run Code Online (Sandbox Code Playgroud) (这个问题与这个jsbin有关)
我有以下路由器配置:
App.Router.map(function() {
this.resource('profile', function () {
this.route('user');
this.route('userEdit');
this.route('company');
this.route('companyEdit');
this.resource('products', function () {
this.route('index');
this.route('show', { path: '/:product_id/show' });
});
});
});
Run Code Online (Sandbox Code Playgroud)
有了这个,ember数据需要以下控制器:
以下路线:
以下模板:
但我无法解决嵌套的资源配置文件/产品.我期待控制器在:
路线在:
以及模板:
相反,通过跟随链接#/profile/products/index,ember正在生成以下对象:
generated -> route:products Object {fullName: "route:products"}
generated -> route:products.index Object {fullName: "route:products.index"}
generated -> controller:products Object {fullName: …Run Code Online (Sandbox Code Playgroud) 刚刚上传到ember1.0和最新的余烬数据.现在当我尝试创建我的商店时,我收到了这个错误.
断言失败:您尝试将
adapter属性设置为实例DS.Adapter,应该是名称或工厂
App.Store = DS.Store.extend({
revision: 12,
adapter: adapter.create()
});
Run Code Online (Sandbox Code Playgroud)
有什么新的/正确的方法吗?
我有两个这样的模型:
App.Build = DS.Model.extend({
allegiance: DS.attr('string'),
profession: DS.attr('string'),
skills: DS.hasMany('skill')
});
App.Skill = DS.Model.extend({
name:DS.attr('string'),
value:DS.attr('number')
});
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我有控制来设置每项技能的忠诚度,职业和价值(最多55个).
然后在我的应用程序控制器的动作哈希中,我有一个动作将构建模型保存到服务器.
save:function(){
var store = this.get('store');
var skills = this.get('controllers.skills').get('model');
console.log(skills);
var build = store.createRecord('build',{
profession:1,
allegiance:1,
skills:skills
});
build.set('skills',skills);
build.save();
console.log('Saved!');
}
Run Code Online (Sandbox Code Playgroud)
但是当构建模型发送到服务器时,技能属性是一个空数组:
{"build":{"allegiance":"1","profession":"1","skills":[]}}
Run Code Online (Sandbox Code Playgroud)
我确定我做错了什么,但我无法弄清楚什么,也找不到任何关于它的好文档.另外一点,我关心提交的是技能ID和价值.
任何帮助将不胜感激!
更新:
按照Daniel的建议,我编辑了save函数,使用pushObjects将技能放入Build模型,然后保存.它现在工作得更好.生成的帖子数据现在是这样的:
{"build":{
"allegiance":1,
"profession":1,
"skills":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55"]}}
Run Code Online (Sandbox Code Playgroud)
这是技能ID的列表.在帖子中没有提交任何其他属性.我已经尝试迭代技能,创建一个新对象,只是推入id和值,这是我需要的唯一部分,但这给了我一个错误.有点像,不能使用undefined,必须是类型技能.
这似乎是Ember数据应该本地处理的东西.是否有一些我缺少的东西让它在请求中发送其他技能属性?
谢谢!!
我有以下型号:
当我调用this.store.find('history');
调用http :: //www.example.com/api/histories/并返回此JSON响应:
{
"tracks":[
{
"id":83,
"title":"Untitled",
"length":148,
"artist_ids":[
],
"album_ids":[
]
},
{
"id":85,
"title":"You want it",
"length":262,
"artist_ids":[
],
"album_ids":[
]
},
{
"id":81,
"title":"Untitled",
"length":133,
"artist_ids":[
],
"album_ids":[
]
},
{
"id":78,
"title":"Untitled",
"length":345,
"artist_ids":[
],
"album_ids":[
]
},
{
"id":80,
"title":"Untitled",
"length":225,
"artist_ids":[
],
"album_ids":[
]
},
{
"id":73,
"title":"Untitled",
"length":366,
"artist_ids":[
],
"album_ids":[
]
},
{
"id":77,
"title":"Untitled",
"length":161,
"artist_ids":[
],
"album_ids":[
]
},
{
"id":82,
"title":"Untitled",
"length":384,
"artist_ids":[
],
"album_ids":[
] …Run Code Online (Sandbox Code Playgroud) 我有简单的模型定义为:
App.Answer = DS.Model.extend({
name: DS.attr('string')
});
App.Question = DS.Model.extend({
questionName: DS.attr('string'),
answers: DS.hasMany('answer')
});
Run Code Online (Sandbox Code Playgroud)
我希望能够添加问题模型的答案,并且能够通过单击按钮删除所有hasMany关联.但是当我在循环中调用deleteRecord时,它会抛出js错误.替代方法是在删除每条记录之后引入一些延迟,我认为这不是正确的做事方式.
这里是用于演示问题的jsbin链接:http://jsbin.com/UleKodiC/2/ 单击"添加"按钮几次,然后单击"全部删除",它应该给你js错误,模型是未定义的.但是,如果单击"删除缓慢"(延迟删除),它会删除记录而不会出现错误.
谢谢,迪
在Ember App Kit中,有许多测试示例随初始回购一起提供.其中之一是基本的路线单元测试.如果数据在模型钩子中是硬编码的,那么这个测试是微不足道的,如下所示:
test("#model", function(){
deepEqual(route.model(), ['red', 'yellow', 'blue']);
});
Run Code Online (Sandbox Code Playgroud)
如果它从ember-data返回一个promise,你如何使用隔离容器来测试模型钩子?
这是测试:
import Activities from 'appkit/routes/activities';
var route;
module("Unit - ActivitiesRoute", {
setup: function(){
var container = isolatedContainer([
'route:activities'
]);
route = container.lookup('route:activities');
}
});
test("#model", function(){
deepEqual(route.model(), ['activity', 'activity2', 'activity3']);
});
Run Code Online (Sandbox Code Playgroud)
而实际的Route的模型钩子:
export default Ember.Route.extend({
model: function() {
return this.get('store').find('activity');
}
});
Run Code Online (Sandbox Code Playgroud)
从kingpin2k实施以下不同方法后.以下是结果摘要.
第一种方法:效果很好......但没有承诺.
第二种方法:返回promise对象(似乎已解析),但数组和正确的值被赋给_detail属性.
test("#model", function(){
deepEqual(route.model()['_detail'], ['activity', 'activity2', 'activity3']); //passes
});
Run Code Online (Sandbox Code Playgroud)
我想在模块设置()中处理商店创建.
...
module("Unit - ActivitiesRoute", {
setup: function(){
var container = isolatedContainer([
'route:activities' …Run Code Online (Sandbox Code Playgroud) 好的,所以我有一个控制器,它的模型设置如下:
App.MyModel = DS.Model.extend({
myOtherProperty: attr(),
mySortKey: attr(),
mySubCollection: function () {
return this.store.filter('MyOtherModel', function (myOtherModel) {
//Some basic filtering logic (it's actually more complex than this)
return myOtherModel.get('someProperty') == this.get('myOtherProperty');
});
}.property('myOtherProperty')
})
Run Code Online (Sandbox Code Playgroud)
实际的过滤函数并不重要 - 重要的是'mySubCollection'计算属性返回DS.PromiseArray对象.上述模型的控制器类型为'Ember.ObjectController',因为它只显示单个对象.
显示此属性的模板使用{{each}}帮助程序执行此操作:
MyTemplate的:
{{#each mySubCollection}}
{{view App.MyView}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)
现在 - 我需要按'mySortKey'属性按降序排序这个promise数组.我怎样才能做到这一点?文档说DS.PromiseArray从Ember.Array扩展,但在'mySubCollection'的计算属性末尾添加'sortBy('mySortKey:desc')'导致它破坏而根本不起作用 - 这是有道理的,因为我会在一个承诺而不是数组上调用'sortBy'.
我看了一堆不同的想法,不断出现的是切换到使用ArrayController.我可以做到这一点,但它并不理想,因为它在一个非常简单的设置之上添加了一堆复杂性,它已经很好用了(除了排序).
有什么想法吗?
我有一个小而相当标准的应用程序:
DS.hasMany属性.app控制器处理一个save事件,然后我存储了这些东西.代码如下所示:
import Ember from 'ember';
export default Ember.Controller.extend({
actions: {
save() {
this.store.peekAll('object').forEach(obj => {
obj.save();
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
这会为本地加载的每个对象发出PUT请求.它工作正常,但它有点蛮力.相反,我想只保存修改过的对象.
我已尝试使用dirtyType,但它返回的undefined内部.forEach,还有hasDirtyAttributes,但它false总是返回.
我可以构建自己的修改对象缓存,但这将是很多工作和容易出错.有没有处理这种情况的标准方法?提前致谢.
我在我的ember应用程序中创建了一个名为ticket-stats的模型:
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
export default Model.extend({
get_tickets_more: attr(),
get_tickets: attr(),
get_avg_tickets: attr()
});
Run Code Online (Sandbox Code Playgroud)
数据来自JSON api:http://domain.com/data/ticketStats?blank = blah ...所以我为这个名为ticket-stats的模型添加了一个特殊的适配器:
import JSONAPIAdapter from 'ember-data/adapters/json-api';
export default JSONAPIAdapter.extend({
host: 'http://domain.com',
namespace: 'data',
pathForType: function(type) {
return Ember.String.camelize(type);
}
});
Run Code Online (Sandbox Code Playgroud)
我在路上获得了这个模型的数据:
import Ember from 'ember';
export default Ember.Route.extend({
model () {
var ticketData;
this.store.query('ticket-stats', { teamID: 218, attUID: 'oc7569', useProd: 1})
.then(function(stats) { ticketData = stats; });
return Ember.RSVP.hash({
currentUser: this.currentUser,
ticketStats: ticketData
}); …Run Code Online (Sandbox Code Playgroud)