Ember.js Контроллер с вычисляемым свойством не пересчитывается

Я пытаюсь добавить разрешения для групп, и у меня настроено перетаскивание, чтобы пользователь мог перетащить невыбранные разрешения на выбранные, или наоборот. Невыбранные разрешения вычисляются путем удаления выбранных разрешений из всех разрешений. Этот код все работает правильно. Когда пользователь впервые открывает страницу, на невыбранной стороне отображаются только те разрешения, которые не выбраны, и те же, что и для выбранных.

Однако, когда пользователь выбирает другую группу для просмотра, выбранная сторона является правильной, в то время как невыбранная сторона показывает то, что отображалось для последней группы. Вот маршрут и контроллер:

App.GroupsEditRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    this._super(controller, model);
    controller.set('allPermissions', this.store.find('permission'));
  },
  actions: {
    'update': function(group){
      var route = this;
      group.save().then(function(){
        route.transitionTo('groups');
      });
    },
    'cancel': function(group){
      group.rollback();
      this.transitionTo('groups');
    },
    'delete': function(group){
      group.destroyRecord();
      this.transitionTo('groups');
    }
  }
});

App.GroupsEditController = Ember.ObjectController.extend({
  unselectedPermissions: function() {
    console.log('UNSELECTED');
    var allPermissions=this.get('allPermissions');
    var permissions=this.get('permissions');
    var self=this;

    allPermissions.then( function() {
      permissions.then( function() {
        var unselected=allPermissions.filter(function(permission) {
          return !permissions.contains(permission);
        });
        unselected=Ember.ArrayProxy.createWithMixins(Ember.SortableMixin, {
          sortProperties: ['name'],
          content: unselected
        });
        self.set('unselectedPermissions',unselected);
      });
    });
  }.property('model.unselectedPermissions'),
  selectedPermissions: function() {
    console.log('SELECTED');
    return Ember.ArrayProxy.createWithMixins(Ember.SortableMixin, {
      sortProperties: ['name'],
      content: this.get('permissions')
    });
  }.property('model.selectedPermissions')
});

Когда я использую unselectedPermissions в моем представлении через {{#each}}, он срабатывает только один раз. После этого я никогда не вижу НЕИЗБРАННЫХ в своем журнале. Тем не менее, SELECTED, который используется таким же образом, срабатывает каждый раз. Конечно, данные, отображаемые на странице, тоже не обновляются, если я не обновлю.

SetupController вызывается каждый раз, когда отображается страница, как и должно быть.

Я не уверен, что я делаю неправильно.

Есть идеи?

1 ответ

Решение

В общем случае вычисляемые свойства не должны быть установлены. Когда вы устанавливаете их, вы уничтожаете вычисленную часть кода. Есть несколько различных способов справиться с этим, самый простой - использовать наблюдатель вместо вычисляемого свойства и установить свойство.

unselectedPermissionList: [],
unselectedWatcher: function() {
    console.log('UNSELECTED');
    var allPermissions=this.get('allPermissions');
    var permissions=this.get('permissions');
    var self=this;

    allPermissions.then( function() {
      permissions.then( function() {
        var unselected=allPermissions.filter(function(permission) {
          return !permissions.contains(permission);
        });
        unselected=Ember.ArrayProxy.createWithMixins(Ember.SortableMixin, {
          sortProperties: ['name'],
          content: unselected
        });
        self.set('unselectedPermissionList',unselected);
      });
    });
  }.observes('selectedPermissions')

Другой способ - вернуть ссылку на массив, а затем вставить объекты в этот массив после факта.

unselectedWatcher: function() {
    console.log('UNSELECTED');
    var allPermissions=this.get('allPermissions'),
        permissions=this.get('permissions'),
        self=this,
        ret = [];

    allPermissions.then( function() {
      permissions.then( function() {
        var unselected=allPermissions.filter(function(permission) {
          return !permissions.contains(permission);
        });
        unselected=Ember.ArrayProxy.createWithMixins(Ember.SortableMixin, {
          sortProperties: ['name'],
          content: unselected
        });
        unselected.forEach(function(item){
          ret.pushObject(item);
        });
      });
    });

    return ret;
  }.property('selectedPermissions')

Кроме того, ваши два свойства утверждают, что они зависят друг от друга, что должно запускать бесконечный цикл обновления свойств (изменения, b грязные, b обновлений, a грязные и т. Д.).

Я не уверен почему selectedPermissions это вычисляемое свойство, кажется, что это будет просто список, который добавляется или удаляется из, и unselectedPermissions будет просто allPermisions не selectedPermissions

Другие вопросы по тегам