Вид Ember не обновляется после массив упорядочения, используемый для создания дочерних представлений

У меня есть представление действий, содержащее массив действий. Этот массив иногда сортируется на основе вычисляемого свойства (distanced_from_home), которое пользователь может обновить. Когда массив отсортирован, я хочу, чтобы дочерние представления повторно отображались в соответствии с новым порядком. Вот мой шаблон и представление:

index.html

  

app.js

  App.ActivitiesView = Em.View.extend({
    templateName: 'activities',
    activities: (function() {
      var list;
      list = App.activityController.activities;
      console.log("Activities View");
      console.log(list);
      return list;
    }).property('App.activityController.activities', 'App.activityController.activities.@each.distance_to_home').cacheable()
  });

Когда я вызываю изменение свойства Distance_to_home, выходные данные console.log показывают, что массив списка правильно отсортирован, но дочерние представления не перерисовывается в новом порядке. Если я выйду из этого представления, а затем вернусь к нему (оно снова отображается), тогда отображается правильный порядок.

Что мне сделать, чтобы представление обновлялось автоматически?

Спасибо,

РЕДАКТИРОВАТЬ

Похоже, это работает здесь, и моя вычисляемая функция «активности» определенно срабатывает, но без переупорядочения представления... Я также пытался использовать наблюдателя, но результаты такие же.

  App.ActivitiesView = Em.View.extend({
    templateName: 'activities',
    classNames: ['activities rounded shadow'],
    homeBinding: 'App.user.home',
    activities: [],
    homeChanged: (function() {
      console.log("homeChanged()");
      this.set('activities', App.activityController.activities.sort(this.compare_activities));
      return null;
    }).observes('home'),

    compare_activities: function(a, b) {
      var result;
      result = 0;
      if (App.user.home != null) {
        result = a.get('distance_to_home') - b.get('distance_to_home');
      }
      return result;
    },

  });

Я также пытался установить для параметра «активности» пустой массив, а затем сбросить его до упорядоченного массива, чтобы принудительно выполнить повторный рендеринг, но это не дало никакого эффекта.

  App.ActivitiesView = Em.View.extend({
    templateName: 'activities',
    classNames: ['activities rounded shadow'],
    homeBinding: 'App.user.home',
    activities: [],
    homeChanged: (function() {
      console.log("homeChanged()");
      this.set('activities', []);
      this.set('activities', App.activityController.activities.sort(this.compare_activities));
      return null;
    }).observes('home'),

    compare_activities: function(a, b) {
      var result;
      result = 0;
      if (App.user.home != null) {
        result = a.get('distance_to_home') - b.get('distance_to_home');
      }
      return result;
    },

  });

EDIT (второй)

Похоже, использование Ember.copy наконец решило эту проблему. Установка свойства массива в пустой массив (или ноль) не имела никакого эффекта. Вот код просмотра, который, наконец, сработал:

  App.ActivitiesView = Em.View.extend({
    templateName: 'activities',
    classNames: ['activities rounded shadow'],
    homeBinding: 'App.user.home',
    activities: [],
    homeChanged: (function() {
      var list;
      list = App.activityController.activities.sort(this.compare_activities);
      this.set('activities', Ember.copy(list), true);
      return null;
    }).observes('home'),
    compare_activities: function(a, b) {
      var result;
      result = 0;
      if (App.user.home != null) {
        result = a.get('distance_to_home') - b.get('distance_to_home');
      }
      return result;
    }
  });

14
задан Community 23 May 2017 в 11:53
поделиться