WedX - журнал о программировании и компьютерных науках

При перезагрузке модели данных Ember элемент в {{each}} удаляется/вставляется обратно — теряется текущее состояние

Как я могу предотвратить удаление itemView и повторную визуализацию на месте при повторении arrangedContent контроллера, если свойство наблюдаемой модели не меняет значение?

Краткая версия ниже, используя запись в блоге App.Post в качестве примера модели:

Контроллер:

sortProperties: ['createdAt']

Шаблон:

{{each arrangedContent}}
    {{title}}
    {{body}}
{{/each}}

objectAt(0).reload() приводит к тому, что соответствующий элемент удаляется и вставляется обратно на то же место. Проблема в том, что itemView теряет предыдущее состояние, так что в результате возникает плохое взаимодействие с пользователем.

Я проследил это до этой последовательности вызовов:

1. retrieved record is pushed onto the store
2. notifyPropertyChange('data') onto the record
3. propertyWillChange('createdAt')
4. arrayWillChange() -> this causes the removal of the item, even though
                        the value of createdAt didn't change
5. arrayDidChange()  -> reinserts the object, it gets re-rendered in the list

Мне нужно, чтобы не выполнялась последовательность удаления/вставки, когда свойство не изменило фактическое значение.

Одна мысль заключалась в том, чтобы поставить в очередь удаления/вставки в arrayWillChange/arrayDidChange и не вызывать их, если значение не изменилось. Я подозреваю, что это вызовет дополнительные проблемы с синхронизацией.

06.06.2014

Ответы:


1

Вы, вероятно, используете find или all для своей коллекции, что делает ее живым фильтром (который удаляет/добавляет ее в коллекции по запросу. Вы можете переместить коллекцию в простой массив, что уберет эту логику. Вы можете сделать это из маршрут или контроллер

Маршрут

App.FooRoute = Em.Route.extend({
  model: function(){
    return this.store.find('foo').then(function(foos){
      return foos.toArray();
    });
  }
});

Контроллер

App.FooController = Em.ArrayController.extend({
  simpleModel: function(){
    return this.get('model').toArray();
  }.property()
});

Затем в вашем шаблоне

{{#each item in simpleModel}}

{{/each}}

Примечание: при этом, если вы добавите новый предмет в магазин, вам нужно будет вручную добавить его в коллекцию.

06.06.2014
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]