DS中的灰烬设置数组 - >不可能?

时间:2014-06-14 15:04:55

标签: ember.js ember-data

我有一个深入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')

1 个答案:

答案 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'));
});

集合访问权限,我建议创建一些引用数组中任意位置的计算属性(在控制器上),而不是使用除firstObjectlastObject以外的任何内容的索引访问权限

console.log(model.toArray().get('0.color'));
console.log(model.get('firstObject.color'));

http://emberjs.jsbin.com/OxIDiVU/666/edit