聚合物+流星,在大火的#each循环中,无法将对象传递到聚合物Web组件

克里斯·鲁西

仅在Polymer中,无需将其与Meteor结合即可将对象传递给聚合物纤网组件,只需将其传递给属性即可。我已经成功做到了。在这里,我们将迭代中的“状态”直接传递到称为状态卡的自定义聚合物Web组件中。

<template repeat="{{state in states}}">
	<state-card class="state-card" stateObj={{state}}></state-card>
</template>

但是,在我的项目中,我将Polymer和Meteor结合在一起。
Polymer的模板和Meteor的blaze模板不能混合使用...因此,仅使用自定义Polymer Web组件即可实现这一点。我无法在流星模板中通过“ #each循环”传递流星中的“状态”对象。作为一个工作回合,我发现只能像这样将单个属性作为文本字符串传递...

<template name="inbox">
    <div class="content" flex>
        {{#each states}}
            <state-card class="state-card" name={{name}} status={{status}} displayType={{displaytype}}></state-card>
        {{/each}}
    </div>
</template>

为了实现上述目的,这是来自定制的Polymer Web组件的代码片段,其属性如下:

<polymer-element name="state-card" attributes="name status displayType" on-click="cardClicked">
    <template>
    ...
    </template>
</polymer-element>

我“真正”想要做的就是像这样将对象直接传递到聚合物纤网组件中……但是,不幸的是,这根本行不通

<template name="inbox">
    <div class="content" flex>
        {{#each states}}
            <state-card class="state-card" stateObj={{this}}></state-card>
        {{/each}}
    </div>
</template>

理想情况下,我应该能够接受具有这样的属性的对象...

<polymer-element name="state-card" attributes="stateObj" on-click="cardClicked">
    <template>
    ...
	</template>
</polymer-element>

这样的问题/答案与我的问题“非常”相似,但是答案没有用,因为我有流星火焰模板并发症...

类似的SO问题/答案

我“真的”不想坚持我的一轮工作……即使它可行。

在SO的其他地方已经读到过,在大火的#each迭代中,您可以像这样访问对象文字...

{{#each humans}}
  {{this}}
{{/each}}

但是,我无法完成这项工作。对于任何帮助和指导,我将不胜感激。我知道我要尝试做的工作,将Polymer和Meteor结合起来会有些问题,但是,我已经看到了它的完成,并且取得了很多进步。在这一点上,我只是绊脚石。谢谢!!!

格雷格·内海塞尔(Greg Neiheisel)

在自定义聚合物元素上设置属性时,聚合物会在设置元素原型的值时尝试检测类型并强制转换属性,因此数字是数字,字符串是字符串,等等。您不是在另一个聚合物元素中设置此属性-就像尝试使用blaze(和我想象的任何其他非聚合物引擎)来设置它一样。

Polymer最终.toString()在您的对象文字上运行,该文字产生“ [object Object]”,几乎没有用。幸运的是,Polymer允许您将对象作为来自外部世界的双引号JSON字符串传递,例如的结果JSON.stringify(something)

最直接但不是最优雅的方法是创建一个字符串化助手,并使用它来设置属性。

Template.registerHelper('stringify', function(obj) {
  return JSON.stringify(obj);
});

{{#each things}}
  <my-component something={{stringify this}}></my-component>
{{/each}}

或者

Template.registerHelper('stringThis', function() {
  return JSON.stringify(this);
});

{{#each things}}
  <my-component something={{stringThis}}></my-component>
{{/each}}

另一种选择是toString在应用程序中的某个级别覆盖该方法。使用流星的文档转换或collection-helpers包,您可以添加一个toString仅返回JSON.stringify(this)的方法-如果要遍历游标。

但是,仅重写Object.prototype.toString并执行相同操作非常困难您会收到循环引用错误,但是看起来有一些库和方法可以在将对象(this传递给JSON.stringify之前回收对象我没有尝试过,但似乎可以。

无论哪种方式,如果将该属性设置为JSON,它将在您的polymer元素中用作实际对象。您甚至可以在该对象内的嵌套属性上设置观察者!

底线-似乎还没有一种完美的方法,因此现在将对象字符串化。希望有帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章