我有一个深入Ember数据模型的数组(imagepost中图片内的投票):
App.Imagepost = DS.Model.extend({
title: DS.attr( 'string' ),
pics: DS.attr(), // array of objects
});
App.Imagepost.FIXTURES = [
{
id: 1,
title: 'First day of school outfit',
pics: [
{
url: 'https://example.com/wow.jpg',
votes: [1, 22, 55] // List of voters' ids
},
{
url: 'https://example.com/funny.jpg',
votes: [7] // List of voters' ids
}
]
}
]
现在我想删除它的投票,但不使用x.set();更改不会反映到模板中,也不会反映到Ember-data
中这是我的代码(ImageController):
var ob = this.get('model').objectAt(0).get('pics').objectAt(0);
console.log(ob);
votes_array.splice(user_id_index, 1);
ob.set('votes', votes_array);
console.log(ob);
给出以下错误:(在ob.set行上)
Uncaught TypeError: undefined is not a function
所以,如果我这样尝试:
var ob = this.get('model').objectAt(0).get('pics').objectAt(0);
console.log(ob);
ob.votes = [];
console.log(ob);
我收到此错误:
Uncaught Error: Assertion Failed: You must use Ember.set() to access this property (of [object Object])
如果我能改变这种奇怪而漫长的路线:
this.get('model').objectAt(0).get('pics').objectAt(0);
类似于:
this.get('model[0].pics[0]'));
也许它可以工作,因为我可以使用 set 而不是 get 做同样的事情,但这种方法不起作用(我如何访问数组?我的控制器是ArrayController,但是使用this.get(),我无法真正访问我的模型)
但是现在我无法弄明白,我只是想从控制器到[22,25]进行投票:[1,25,55]并且更改将反映在模板中&安培; Ember公司的数据。
顺便说一句,如果我在一个组件中更改数组,它也不能反映这些更改。
同样奇怪的是,虽然标题已经设置,但这行仍未定义:
this.store.find('imagepost', 1).get('title')
答案 0 :(得分:2)
set
/ get
是在从Ember.Object派生的对象上定义的。一旦超过Ember Data属性的第一层,就可以使用POJO了。如您所见,您收到错误Uncaught TypeError: undefined is not a function
。如果将POJO与Ember一起使用,您仍然可以使用getter和setter,但不能直接在实例上使用。 e.g。
var foo = { a: 'asdf'};
// getting, bar will contain 'asdf'
var bar = Ember.get(foo, 'a');
// setting, foo.a will be 'piano'
Ember.set(foo, 'a', 'piano');
使用索引
可以进行数组访问{{foo.0.foo.1.bar}}
或
Em.get(foo, '0.foo.1.bar');
示例:http://emberjs.jsbin.com/yabateji/1/edit
商店返回承诺,因此您需要等待它们解析才能访问记录中的属性。
this.store.find('imagepost', 1).then(function(record){
console.log(record.get('title'));
});
集合访问权限,我建议创建一些引用数组中任意位置的计算属性(在控制器上),而不是使用除firstObject
和lastObject
以外的任何内容的索引访问权限
console.log(model.toArray().get('0.color'));
console.log(model.get('firstObject.color'));