SvelteJs: глубокое наблюдение за вычисленными свойствами - PullRequest
0 голосов
/ 23 октября 2018

На данный момент мы можем сделать следующее, используя вычисленные свойства.

isTypeRange: ({ field }) => {
        return field && field.type === "Range";
      }

Можем ли мы сделать что-нибудь подобное?

fieldLength: ({field.values.length}) => {
  return field.values.length;
}

По этой ссылке https://github.com/sveltejs/svelte/issues/11в конечном итоге привел меня к https://github.com/sveltejs/svelte-extras/. Но это снова объясняет глубокое наблюдение.

Обновление: PS Я знаю, что {field.values.length} является недействительным javascript, я просто пытаюсь показать, чего я хочу достичь,Значение наблюдения вложенных свойств, аналогично тому, как ember делает

fieldLength: Ember.computed('field.values.[]', {
get(){}, set(){}
})

1 Ответ

0 голосов
/ 23 октября 2018

Короткий ответ - нет - в Svelte изменения отслеживаются на верхнем уровне (компонента или хранилища ), так как мониторинг вложенных свойств отдельно потребует намного больше кода и внутренней книги.-keeping.Поэтому fieldLength будет пересчитываться при каждом изменении field (где «изменение» может означать либо новый объект, либо мутацию существующего, если вы не используете опцию immutable ).Ничто из того, что зависит от fieldLength, не будет обновлено, если только длина не изменилась.

Более длинный ответ состоит в том, что ({field.values.length}) => ... является недопустимым JavaScript, но есть действительный (если зрительносбивающий с толку) способ выразить ту же идею:

fieldLength: ({field:{values:{length}}}) => length

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

...