将数据传递给框架中的组件时有哪些最佳实践?
What are some best practices when passing data to a component in a-frame?
我对 a-frame 很陌生,但我真的很喜欢创建组件并将它们用作 HTML 中的基元。在我当前的项目中,我正在创建一个框架组件,它在给定一组顶点的情况下创建几何体。我正在以通用方式创建组件,以便我可以将不同的顶点集传递给它并创建不同的形状。
尽管这是一个具体问题,但它涉及一个更普遍的问题,即建议将可能相当大的数据集(对象、数组)传递到组件中的方法是什么。理想情况下,我希望能够通过原语从 html 层传递它们。数据量会有所不同,因此我无法在每个数据项的模式中硬编码不同的 属性。
我目前的解决方案是将数据作为全局变量提供。然后,我将变量名称作为字符串传递给组件,并使用 window[variablename]
将其转换为变量名称。需要明确的是,这工作正常,但我很想知道是否有更好的方法(或者我可能会尝试的替代方法)。
请在下面找到我正在做的事情的例子;
这是我在这个例子中使用的数据位;
var exampleArraydata = [
{
"x":3,
"y":3,
"z":5
},
{
"x":0,
"y":15,
"z":0
},
{
"x":15,
"y":0,
"z":0
}
]
var exampleObjectdata = {
"x":3,
"y":3,
"z":5
}
这是示例组件;
AFRAME.registerComponent('examplecomponent', {
schema: {
exampleArray: {type: 'string', default: 'foo'},
exampleObject: {type: 'string', default: 'bar'},
},
init: function (){
this.testArray = window[this.data.exampleArray]
this.testObject = window[this.data.exampleObject]
//logging just to check that it works
console.log(this.testArray)
console.log(this.testObject)
//make geometry with these vec3s...
}
});
这是我用那个组件创建的原语;
AFRAME.registerPrimitive('a-example', {
defaultComponents: {
examplecomponent: {}
},
mappings: {
array: 'examplecomponent.exampleArray',
object: 'examplecomponent.exampleObject'
}
});
这里是自定义 html 标签,我在其中将变量名作为属性传递;
<a-example
array="exampleArraydata"
object="exampleObjectdata">
</a-example>
同样,这确实有效,所以如果人们认为这是一个好方法,那就太好了,但我对此并不陌生,如果对此有任何问题,我真的很感激理解问题是什么,最好是一些替代建议.例如,如果对象托管在 URL 而不是我自己代码中的 var 会怎么样?
您也可以使用自己的自定义解析函数从
HTML 属性的特殊方式。
这是文档中的示例:
https://aframe.io/docs/0.7.0/core/component.html#custom-property-type
schema: {
// Parse slash-delimited string to an array (e.g., `foo="myProperty: a/b"` to `['a', 'b']`).
myProperty: {
default: [],
parse: function (value) {
return value.split('/');
}
}
}
污染全局命名空间 (window) 可能会导致问题 - 有一天您可能会覆盖重要的变量并且很难追踪到,因为它不会 undefined
。建议的方法是通过 HTML 属性传递数据 - 正如您自己想的那样。
Noam Almosnino 为您指明了正确的方向。你可以随心所欲地解析数据,如果你想将一个对象传递给组件,只需解析它的 strigied 版本:
<a-example objectData="{\"x\":3,\"y\":3,\"z\":5}"></a-example>
schema: {
objectData: {
default: {},
parse: function (str) {
return JSON.parse(str);
}
}
}
我对 a-frame 很陌生,但我真的很喜欢创建组件并将它们用作 HTML 中的基元。在我当前的项目中,我正在创建一个框架组件,它在给定一组顶点的情况下创建几何体。我正在以通用方式创建组件,以便我可以将不同的顶点集传递给它并创建不同的形状。
尽管这是一个具体问题,但它涉及一个更普遍的问题,即建议将可能相当大的数据集(对象、数组)传递到组件中的方法是什么。理想情况下,我希望能够通过原语从 html 层传递它们。数据量会有所不同,因此我无法在每个数据项的模式中硬编码不同的 属性。
我目前的解决方案是将数据作为全局变量提供。然后,我将变量名称作为字符串传递给组件,并使用 window[variablename]
将其转换为变量名称。需要明确的是,这工作正常,但我很想知道是否有更好的方法(或者我可能会尝试的替代方法)。
请在下面找到我正在做的事情的例子;
这是我在这个例子中使用的数据位;
var exampleArraydata = [
{
"x":3,
"y":3,
"z":5
},
{
"x":0,
"y":15,
"z":0
},
{
"x":15,
"y":0,
"z":0
}
]
var exampleObjectdata = {
"x":3,
"y":3,
"z":5
}
这是示例组件;
AFRAME.registerComponent('examplecomponent', {
schema: {
exampleArray: {type: 'string', default: 'foo'},
exampleObject: {type: 'string', default: 'bar'},
},
init: function (){
this.testArray = window[this.data.exampleArray]
this.testObject = window[this.data.exampleObject]
//logging just to check that it works
console.log(this.testArray)
console.log(this.testObject)
//make geometry with these vec3s...
}
});
这是我用那个组件创建的原语;
AFRAME.registerPrimitive('a-example', {
defaultComponents: {
examplecomponent: {}
},
mappings: {
array: 'examplecomponent.exampleArray',
object: 'examplecomponent.exampleObject'
}
});
这里是自定义 html 标签,我在其中将变量名作为属性传递;
<a-example
array="exampleArraydata"
object="exampleObjectdata">
</a-example>
同样,这确实有效,所以如果人们认为这是一个好方法,那就太好了,但我对此并不陌生,如果对此有任何问题,我真的很感激理解问题是什么,最好是一些替代建议.例如,如果对象托管在 URL 而不是我自己代码中的 var 会怎么样?
您也可以使用自己的自定义解析函数从 HTML 属性的特殊方式。
这是文档中的示例: https://aframe.io/docs/0.7.0/core/component.html#custom-property-type
schema: {
// Parse slash-delimited string to an array (e.g., `foo="myProperty: a/b"` to `['a', 'b']`).
myProperty: {
default: [],
parse: function (value) {
return value.split('/');
}
}
}
污染全局命名空间 (window) 可能会导致问题 - 有一天您可能会覆盖重要的变量并且很难追踪到,因为它不会 undefined
。建议的方法是通过 HTML 属性传递数据 - 正如您自己想的那样。
Noam Almosnino 为您指明了正确的方向。你可以随心所欲地解析数据,如果你想将一个对象传递给组件,只需解析它的 strigied 版本:
<a-example objectData="{\"x\":3,\"y\":3,\"z\":5}"></a-example>
schema: {
objectData: {
default: {},
parse: function (str) {
return JSON.parse(str);
}
}
}