После обновления до ember 3.15 помощники, которые дали обещание, пересчитывают бесконечно - PullRequest
1 голос
/ 27 января 2020

У меня проблемы с установкой этой ошибки, но что-то произошло, когда я обновился с 3.13 до 3.15. В некоторых (но не во всех) шаблонах, где я использую результат помощника в блоке let, помощник будет перерисовываться бесконечно.

{{#let (data-fetch-task @theThing) as |data|}}

  {{await data}}

{{/let}}

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

Я видел примеры того, как это происходило в прошлом из-за таких ошибок:

https://github.com/emberjs/ember.js/issues/14351

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

Браузер замедлится до сканирования, и если я добавлю выражение console.log ('hi') в функцию вычисления помощника, я увидим тысячи приветов. Так что я знаю, что его вызывают снова и снова

Я знаю, что это не очень полный вопрос, но я сейчас в затруднении, и это лучшее, что я могу разобрать.

Есть ли что-нибудь, что может произойти в октанификации моего приложения, что могло бы сделать это?

РЕДАКТИРОВАТЬ --- БОЛЬШЕ ИНФОРМАЦИИ

Это базовая версия мой помощник, которого вызывают снова и снова. «field» - это EmberObject, который содержит информацию о модели - в данном случае доступные значения для поля.

import Helper from '@ember/component/helper';
import { inject as service } from '@ember/service';

export default class AvailableValsHelper extends Helper  {
  @service store;

  compute([field]){
    console.log("started");
    return field.availableValues(this.store);
  }
}

availableValues ​​равно

(store) => store.findAll('product-types');

Лог c верен. Если я добавлю его в вычисляемое свойство, оно будет работать нормально.

Помощник используется в шаблоне, подобном следующему:

    {{#let (available-vals @field) as |opts|}}
      {{log opts}}
    {{/let}}

Если я опускаю журнал, он работает нормально, но это на самом деле не вызывается, так ... ну и что: - /

Я попытался сделать помощник функцией вместо класса, и я попытался изменить область действия "store" на компонент с тем же результатом. Я прошел весь путь вверх по стеку, чтобы удостовериться, что @ и это, и так далее, c. правы также в случае, если это была проблема с путаницей имени / области видимости. Если это проглотило ошибку, то я не знаю, почему она будет работать как cp на компоненте - по-видимому, это другой режим сбоя.

И это только один помощник. У меня есть другой, который возвращает задачу, и он делает то же самое. Я никогда не выбирал поведения Octane, хотя использовал почти все шаблоны проектирования: синтаксис угловых скобок, нативные классы, async / await и т. Д. c. Я был на 3.13, и когда я пошел на 3.15, это выскочило. Как я уже сказал, если я определяю вспомогательный вывод как cp для компонента, он работает, так что это «обходной путь». Я не могу помочь, но чувствую, что наткнулся на какой-то странный способ сбоя или у меня конфиг конфиг, где некоторые оболочки делают вещи «по-октановски», а другие «по-старому».

Однажды я увидел в консоли другую трассировку, которая была из «store», и там говорилось, что максимальный уровень стека превышен во время вызова findAll. Это буквально заставило меня сделать полный сброс на моем компьютере, поэтому я не смог его сохранить. Я должен был сфотографироваться с моим телефоном. Там была строчка про "отслеживаемую". Я не помню, что он сказал. Но когда я смотрел на него, меня удивляло, потому что ссылка на «store» является закрытием, пытался ли он отслеживать изменение значения, которое не имело контекста значения. Я не очень хорошо знаком с тем, как все это работает, но я подумал, что было странно видеть этот вызов, когда думал, что все, что я делал, было довольно простым приложением метода.

...