我正在使用Ember和Ember数据从REST API加载几百个对象,使用自定义适配器中的findAll调用.我有一个引用findAll的ArrayController.content,然后使用最近添加的Ember.Select在select小部件/下拉菜单中显示对象.一旦完全呈现所有对象(每个对象都是select的选项),我需要在select小部件上运行一个函数 - 特别是Chosen.js库.
因为处理select中的几百个对象需要一些时间(2-4秒),所以在事件Ember.Select.didInsertElement和Ember.ArrayController.contentDidChange上使用回调不太有用; 他们都很快开火.那么是否可以使用另一种事件或另一种方法呢?
我正在慢慢地将我的rails网站从传统的rails往返每个视图应用程序转移到最终将基于单页ember.js的应用程序.作为此迁移的一部分,我是按步骤进行操作,而不是一次性将整个应用程序迁移到单个页面应用程序,而是逐个部分.
我对一个似乎很普遍的问题感到难过.当我为JSON视图和HTML视图使用相同的控制器时,在Chrome中按回来偶尔会向我显示JSON视图而不是HTML视图.
例如,我有一个端点/组合/ 13,它是这些部分ember.js应用程序之一的入口点,它导致Ember数据在同一端点上使用应用程序/提取ID为#13的投资组合的JSON json作为Accept:标题.在向前导航到更深的页面后按回来将获得页面的JSON表示而不是HTML.
我是否需要强制Ember Data使用format参数,以使JSON版本位于不同的URL?如果是这样,那怎么做呢?
我究竟做错了什么?
拥有以下用户模型:
Sks.User = DS.Model.extend
firstName: DS.attr("string")
lastName: DS.attr("string")
Run Code Online (Sandbox Code Playgroud)
应该在哪里声明'fullName'计算属性?
fullName: Ember.computed(->
firstName = @get("firstName")
lastName = @get("lastName")
firstName = "" if firstName is `undefined`
lastName = "" if lastName is `undefined`
lastName + " " + firstName
).property("firstName", "lastName")
Run Code Online (Sandbox Code Playgroud)
它应该在'UsersController'中还是直接在模型中?Ember文档说只在会话中使用的字段应该写在控制器中.但问题是我无法访问索引模板中的'fullName':
Sks.IndexController = Ember.Controller.extend
needs: ['users']
Run Code Online (Sandbox Code Playgroud)
在这里,'fullName'无法访问(在控制器中声明)
{{#each user in controllers.users}}
<li>{{user.fullName}}</li>
{{/each}}
Run Code Online (Sandbox Code Playgroud)
但它是在模型中的时候.
什么是服务器的ember-data当前默认预期响应,如果它有200以外的东西,那么它不会抛出未捕获的异常,而是解析错误以供以后使用?
例如{"errors":{jsonerror}} ???
我应该如何处理Ember中的服务器错误响应(json格式)?
谢谢!
我定义了以下模型:
App.Post = DS.Model.extend({
title: DS.attr('string'),
comments: DS.hasMany('comment')
});
App.Comment = DS.Model.extend({
message: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)
如果我使用Comment创建一个Post条目,那么存储在我的浏览器本地存储中的JSON会引用注释作为ID数组,它可以很好地工作:
...
"o3duh":{
"id":"o3duh",
"title":"How to write Ember",
"comments":[
"jf0a2"
]
}
...
Run Code Online (Sandbox Code Playgroud)
但是,当我添加另一个帖子时,JSON突然改变,以便嵌入评论:
...
"o3duh":{
"id":"o3duh",
"title":"How to write Ember",
"comments":[
{
"message":"First!"
}
]
},
"6kudl":{
"id":"6kudl",
"title":"Learning Ember is painful",
"comments":[
]
}
...
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我能预防吗?这引起了我的问题,因为一旦它变成这种嵌入格式,重新加载页面时LSAdapter就无法读取数据.
这是一个JSBin,所以你可以看到它发生在自己身上并看到完整的JSON等.要重现问题,只需创建一个帖子并添加注释,然后你可以刷新页面没有问题.然后添加另一篇文章并尝试刷新页面.
我不确定问题是否与ember-data或localstorage适配器有关.
从Ember.Data 1.0 Beta开始,我们必须使用store.find('model')而不是App.Model.find().如何访问App对象中的商店对象?
var App = Ember.Application.create({
auth: function() {
return new Ember.RSVP.Promise(function(resolve, reject) {
// ... get token somehow ...
// how to get store?
this.store.find('user').then(function(users) {
App.set('user', users.get('firstObject');
resolve();
}, function(err) {
reject();
});
});
}
});
App.deferReadiness();
App.auth().then(App.advanceReadiness());
Run Code Online (Sandbox Code Playgroud) 我有以下两种型号:
App.Child = DS.Model.extend({
name: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)
和:
App.Activity = DS.Model.extend({
children: DS.hasMany('child',{async:true}),
name: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)
我想使用复选框在hasMany关系中在现有子节点之间进行选择.
例如,我有这三个孩子:
App.Child.FIXTURES = [
{ id: 1, name: 'Brian' },
{ id: 2, name: 'Michael' },
{ id: 3, name: 'James' }
];
Run Code Online (Sandbox Code Playgroud)
用户应该能够在创建或编辑活动时使用复选框,以选择要添加到hasMany关系的子项.
我创建了一个JSFiddle来说明我的问题:http://jsfiddle.net/Dd6Wh/.点击"创建新活动"以查看我正在尝试执行的操作.
基本上它与Ember.Select [...] multiple ="true"相同,但是对于复选框.
对于像Ember.js这样的事情,正确的方法是什么?
我正在尝试使用Ember Data的hasMany字段来返回一个数组,并将数组中的项计数作为计算属性.但是,当我执行以下操作时,它会返回一个对象(由于{async:true}似乎是一个promise)?而不是我期望的数组.
App.Shift = DS.Model.extend({
name: DS.attr('string'),
people: DS.hasMany('person', {async: true});
number_of_people: (function(){
this.get('people').length
}).property('people')
)};
App.Person = DS.Model.extend({
first_name: DS.attr('string'),
last_name: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)
更新:我想回报人的长度.我试过这个但是当我访问该属性时,我得到了仍然返回的promise对象,而不是当时返回的完成promise的值.如何获得承诺返回的评估值?
number_of_people: (function(){
return this.get('people').then(function(people){
return people.get('length');
});
})
Run Code Online (Sandbox Code Playgroud) 我正在使用Ember Data 2.2.0和Ember 2.2.1.从数据存储中检索模型后,我想将模型的类型名称作为字符串.
根据API Docs,DS.Model定义了一个modelName 属性,它看起来像我想要的.但是,在从商店中检索后,我发现model.modelName并且model.get('modelName')未定义.modelfindRecord
另一方面model._internalModel.modelName,按预期返回模型的小写,虚线化名称.
这里发生了什么?
Ember.Mixin我的应用程序中包含DS.attr()和/或包含的内容很少DS.belongsTo().我想知道我应该如何对它们进行单元测试?
默认情况下,ember-cli会生成此测试
test('it works', function(assert) {
var MyModelObject = Ember.Object.extend(MyModelMixin);
var subject = MyModelObject.create();
assert.ok(subject);
});
Run Code Online (Sandbox Code Playgroud)
但当我尝试与DS.attr()我交互时,我收到以下错误:
TypeError: Cannot read property '_attributes' of undefined
at hasValue (http://localhost:4200/assets/vendor.js:90650:25)
at Class.get (http://localhost:4200/assets/vendor.js:90730:13)
at Descriptor.ComputedPropertyPrototype.get (http://localhost:4200/assets/vendor.js:29706:28)
at Object.get (http://localhost:4200/assets/vendor.js:35358:19)
at Class.get (http://localhost:4200/assets/vendor.js:49734:38)
at Object.<anonymous> (http://localhost:4200/assets/tests.js:20126:25)
at runTest (http://localhost:4200/assets/test-support.js:2779:28)
at Object.run (http://localhost:4200/assets/test-support.js:2764:4)
at http://localhost:4200/assets/test-support.js:2906:11
at process (http://localhost:4200/assets/test-support.js:2565:24)
Run Code Online (Sandbox Code Playgroud)
这让人感觉到了.最好的方法是什么?我应该DS.Model在测试中创建一个然后应用mixin吗?
谢谢 !