I can include an array in an Ember object, and display the contents using Handlebars. However, I can only replace the array contents using set(). How can I modify the array contents using push/pop/etc. and still have the UI bindings update?
// JS
App.obj = Ember.Object.create({
"things": ["1", "2"],
});
App.obj.set("things", ["1", "2", "3"]); // Works
App.obj.things.push("3"); // Doesn't Work
// HTML + Handlebars
{{#with App.obj}}
<ul>
{{#each things}}
<li>{{this}}</li>
{{/each}}
</ul>
{{/with}}
For working with collections, Ember.js provides an Array wrapper class, Ember.Array / Ember.MutableArray
So, instead of using a plain array, use these:
// JS
App.obj = Ember.Object.create({
"things": Ember.A(["1", "2"])
});
App.obj.things.pushObject("3"); // pushObject notifies observers
// HTML + Handlebars
{{#with App.obj}}
<ul>
{{#each things}}
<li>{{this}}</li>
{{/each}}
</ul>
{{/with}}
Use an instance of Ember.ArrayController,simply declaring an array with [] will also create array of Ember.ArrayController class.
If you want to add an Object at the end of Ember ArrayController you can use the addObject() method;
eg.
mutableArray:[],
setModel:function(){
var data1={'id':1,'name':'over'};
var data2={'id':3,'name':'out'};
this.get('mutableArray').addObject(data1);
this.get('mutableArray').addObject(data2);
/* To Add Object to middle of array at given index simply use the native array splice method */
var data1={'id':2,'name':'and'}
this.get('mutableArray').splice(1,0,data1);
return this.get('mutableArray')
}.property('mutableArray')
来源:https://stackoverflow.com/questions/9061107/how-to-push-pop-arrays-in-ember-js