到目前为止,我们可以使用计算属性执行以下操作。
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/ .但这再次解释了深度观察。
更新: 附言 我知道 {field.values.length} 是无效的 javascript,我只是想展示我想要实现的目标。意思是观察类似于 ember 的嵌套属性
fieldLength: Ember.computed('field.values.[]', {
get(){}, set(){}
})
最佳答案
简短的回答是否定的——在 Svelte 中,更改是在顶层(组件的或 store 的)跟踪的,因为单独监视嵌套属性将涉及更多的代码和内部簿记。因此,只要 field
发生变化,就会重新计算 fieldLength
(这里的“变化”可能意味着新对象,也可能是现有对象的突变,除非您使用 immutable 选项).但是,除非长度发生变化,否则 依赖于 fieldLength
的任何内容都不会更新。
较长的答案是 ({field.values.length}) => ...
是无效的 JavaScript,但是有一种有效的(如果看起来很困惑)表达相同的方式想法:
fieldLength: ({field:{values:{length}}}) => length
可能 Svelte 的 future 版本可以跟踪嵌套属性并且仅在它们更改时重新计算值——如果是这样,它将通过使用解构语法找出哪些嵌套属性是依赖项。但无论我们 future 的意图如何,这种方法在今天仍然有效,尽管偶尔会进行不必要的重新计算。
关于SvelteJs : Deep observe on computed properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52939745/