Как наблюдать добавление элемента в массив

Я хочу наблюдать добавление элемента в массив. ниже - тестовая программа.

<!-- library load -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script>!window.jQuery && document.write(unescape('%3Cscript src="js/libs/jquery-1.6.1.min.js"%3E%3C/script%3E'))</script>
<script src="http://cloud.github.com/downloads/emberjs/ember.js/ember-0.9.5.min.js"></script>

<script type="text/x-handlebars">
  {{#each App.ArrayController.array}}
    {{foo}}
  {{/each}}
  <button onclick="App.ArrayController.addElement();">add</button>
</script>
<script type="text/javascript">
  var App = Em.Application.create();
  App.ArrayController = Em.Object.create({
    array: [{foo:1}, {foo:2}, {foo:3}],
    addElement: function() {
      this.array.pushObject({foo:4});
    },
    elementAdded: function() {
      alert('ok'); // not invoked...
    }.observes('array')
  })
</script>  

Но когда call addElement, elementAdded не вызывается... Как я могу наблюдать за добавлением элемента?

Ответы

Ответ 1

использовать наблюдения ('array. @each'). Код jsfiddle здесь

Ответ 2

Вы можете использовать Ember.ArrayController и перезаписать функцию arrayDidChange И необязательно вызывать другие методы из этого.

<!-- library load -->
<script type="text/x-handlebars">
  {{#each App.ArrayController.array}}
    {{foo}}
  {{/each}}
  <button onclick="App.ArrayController.addElement();">add</button>
</script>
<script type="text/javascript">
  var App = Em.Application.create();
  App.arrayController = Ember.ArrayController.create({
    content: [{foo:1}, {foo:2}, {foo:3}],
    addElement: function() {
      console.log(this);
      var array = this.get('content')
      array.pushObject({foo:4});
      // this.set('array', array);
    },
    elementAdded: function() {
      console.log('ok'); // not invoked...
    }.observes('array'),

    arrayDidChange: function(item, idx, removedCnt, addedCnt) {
      this.elementAdded();
      this._super(item, idx, removedCnt, addedCnt);
    }
  });
</script>

И вы можете использовать Observers

Ответ 3

Проверьте эту скрипту, чтобы узнать, как точно узнать, какой объект был добавлен или удален из массива с помощью ArrayController.