"Some JS files act more like libraries - they [...] never manipulate QML component instances directly" - 中间立场?
"Some JS files act more like libraries - they [...] never manipulate QML component instances directly" - middle ground?
引自Defining JavaScript Resources In QML:
Some JavaScript files act more like libraries - they provide a set of helper functions that take input and compute output, but never manipulate QML component instances directly.
如果我想要一个同时满足以下条件的 JS 文件怎么办:
- 操纵 QML 组件实例(作为参数传递给它)
- 没有为导入它的每个 QML 组件实例获取其代码和存储数据的副本?
我可以得到 "no data stored on every instance" 部分,好吧,不把全局变量放在 JS 文件中。但是,由于某些奇怪的原因,似乎也为每个实例存储了 "code" 部分的副本。我不明白为什么会这样,但我想知道我是否可以规避它,需要付出什么代价。
我认为您从文档中引用的那行是不正确的,或者至少措辞很糟糕;您仍然可以拥有一个包含 .pragma library
的 JS 文件,并操作作为参数传入其函数的 QML 对象。这句话可能指的是 previous section.
要跨 qml 文件共享数据,请考虑使用 qml Singleton。
出于数据共享的目的,我不建议使用 .pragma library
(@Mitch),原因如下。
.pragma library
js 在 qml 对象操作中提供有限的 功能。虽然简单的 qml 对象操作(如 属性 reading/writing)可以用 .pragma library
js 完成,它不允许 creating/deleting qml 对象(就像在常规的非库 js 中一样)。当您的应用程序变得动态时,它会很糟糕。
.pragma library
只创建一个实例只是 Qt 实现中的一种优化。 从不保证 Qt 只会创建一个实例,也不会真正共享您的数据。
嗯,.pragma library
从一开始就不是为了做数据共享工作而设计的。只是,不要尝试这样做。
引自Defining JavaScript Resources In QML:
Some JavaScript files act more like libraries - they provide a set of helper functions that take input and compute output, but never manipulate QML component instances directly.
如果我想要一个同时满足以下条件的 JS 文件怎么办:
- 操纵 QML 组件实例(作为参数传递给它)
- 没有为导入它的每个 QML 组件实例获取其代码和存储数据的副本?
我可以得到 "no data stored on every instance" 部分,好吧,不把全局变量放在 JS 文件中。但是,由于某些奇怪的原因,似乎也为每个实例存储了 "code" 部分的副本。我不明白为什么会这样,但我想知道我是否可以规避它,需要付出什么代价。
我认为您从文档中引用的那行是不正确的,或者至少措辞很糟糕;您仍然可以拥有一个包含 .pragma library
的 JS 文件,并操作作为参数传入其函数的 QML 对象。这句话可能指的是 previous section.
要跨 qml 文件共享数据,请考虑使用 qml Singleton。
出于数据共享的目的,我不建议使用 .pragma library
(@Mitch),原因如下。
.pragma library
js 在 qml 对象操作中提供有限的 功能。虽然简单的 qml 对象操作(如 属性 reading/writing)可以用.pragma library
js 完成,它不允许 creating/deleting qml 对象(就像在常规的非库 js 中一样)。当您的应用程序变得动态时,它会很糟糕。.pragma library
只创建一个实例只是 Qt 实现中的一种优化。 从不保证 Qt 只会创建一个实例,也不会真正共享您的数据。嗯,
.pragma library
从一开始就不是为了做数据共享工作而设计的。只是,不要尝试这样做。