ошибка ember / предотвращения утечки состояния в объектах ember при сортировке свойства

#ember.js #ember-cli

#ember.js #ember-cli

Вопрос:

 import Controller from "@ember/controller";
import { computed } from "@ember/object";

export default Controller.extend({
  filter: "",
  filterTodos: computed("arrangedContent", "filter", function() {
    var filter = this.get("filter");
    var rx = new RegExp(filter, "gi");
    var todos = this.model;
    return todos.filter(function(todo) {
      return todo.get("title").match(rx) || todo.get("body").match(rx);
    });
  }),
  sortedProperties: ["date:asc"],
  sortedTodos: computed.sort("model", "sortedProperties")
});

  

ошибка 14:3 В качестве свойств по умолчанию в ember / avoid-leaking-state-in-ember-objects разрешены только строка, число, символ, логическое значение, null, неопределенное значение и функция

✖ 1 проблема (1 ошибка, 0 предупреждений)

Комментарии:

1. Привет, Аббас, и добро пожаловать в Stack Overflow. Когда вы сталкиваетесь с подобными ошибками eslint, вы можете выполнить поиск в Google по названию ошибки, и вы найдете документацию, которая объясняет причины правил и способы их исправления. В вашем случае: github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules /… и github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules /… . Если у вас есть более конкретные вопросы о том, как решить в вашем случае, пожалуйста, укажите более подробную информацию в вашем вопросе

Ответ №1:

Просматривая ошибку, вы нарушаете правило eslint ember/avoid-leaking-state-in-ember-objects . Обычно вы можете выполнить поиск в Google по названию правила и найти описание правила и способы его исправления. Вот документ для этого правила: https://github.com/ember-cli/eslint-plugin-ember/blob/master/docs/rules/avoid-leaking-state-in-ember-objects.md

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

В вашем случае вы используете массив для значения sortedProperties . Согласно документации по правилам eslint, приведенной выше, вы обычно можете обойти это, установив начальное значение на init . Однако свойство сортировки является особым случаем, и вы можете увидеть предлагаемый подход, просмотрев документацию для computed.sort :https://api.emberjs.com/ember/3.4/classes/@ember/object/computed/methods/sort?anchor=sort

Как вы можете видеть, они предлагают использовать Object.freeze , что предотвратит изменение свойства. Итак, это должно сработать:

sortedProperties: Object.freeze(["date:asc"]),

Комментарии:

1. Пожалуйста, обратите внимание, что это больше не проблема при использовании собственных классов с ember, поскольку они предоставляют поля класса, которые не являются общими для экземпляров. Вы могли бы прочитать больше о собственных классах в ember здесь: blog.emberjs.com/2019/02/11 /…