自定义元素中的聚合物数据绑定

时间:2014-09-17 10:14:17

标签: polymer

我已按照http://www.polymer-project.org/docs/polymer/binding-types.html#iterative-templates中的示例进行操作,但我没有工作代码。

我试图为我制造的怪物创作工具制作一个聚合物元素,因为我的一个朋友对于一个怪物战斗游戏有很好的想法,我想帮助他跟踪他的想法。

所以我为怪物统计领域制作了一个自定义元素。由于我们并不完全确定所有统计数据最终会是什么,因此我希望尽可能将其设为模块化。

<link rel="import" href="../../../bower_components/paper-input/paper-input.html">

<!-- Calling noscript until I can better understand -->
<polymer-element name="monster-stat-field"
attributes = "stat value"
noscript
>

<template>
    <div id="name">
        {{stat}}
    </div>
    <div id="value">
        <paper-input
            type="number"
            error="Required, needs to be a number!"
            required
            label="{{stat}}"
            value="{{value}}"
            layout vertical>
        </paper-input>
    </div>
</template>

</polymer-element>

这应该可以继承纸张输入,当然。

我所做的是将其嵌套在另一个定制的聚合物元素中:

<link rel="import" href="../monster-stat-field/monster-stat-field.html">
<link rel="import" href="../../../bower_components/paper-input/paper-input.html">
<link rel="import" href="../../../bower_components/paper-button/paper-button.html">

<!-- Calling noscript until I can better understand -->
<polymer-element name="monster-form"
attributes = "name desc stats"
noscript
>
<template>
    <p>
        <paper-input
            label="Monster Name"
            value="{{name}}"
            required
            floatingLabel
            error="Required Field!">
        </paper-input>
    </p>
    <p>
        <paper-input
            label="Description"
            value="{{desc}}"
            floatingLabel>
        </paper-input>
    </p>
    <template repeat="{{s in stats}}">
            <p>
                <monster-stat-field stat="{{s.name}}" value="{{s.value}}">
                </monster-stat-field>
            </p>
    </template>

    <paper-button label="Save" raisedButton></paper-button>
</template>

</polymer-element>

然后在我的主页上我有:

<link rel="import" href="static/customComponents/monster/monster-form/monster-form.html">
...some other stuff...
    <monster-form
        name="Amalgam"
        desc="The Liquid Metal"
        stats="[
            {name: 'hp', value: 60},
            {name: 'cost', value: 60},
            {name: 'ene', value: 90},
            {name: 'str', value: 90},
            {name: 'wis', value: 75},
            {name: 'def', value: 95},
            {name: 'man', value: 90},
            {name: 'agi', value: 100}
            ]"
    ></monster-form> <br/>
    <p>Here is calling the monster stat field manually</p> <br/>
    <monster-stat-field stat="HP" value="60">
    </monster-stat-field>

原来如此!我显示的是怪物的名称和desc,但统计数据根本不存在。手动调用它确实有效,但我觉得这很奇怪,因为我没有明确地导入它。

这是因为我正在调用noscript吗?或者是别的什么?任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

您需要更改两件事才能使其发挥作用:

stats属性的JSON字符串不正确。你需要在哈希键周围加双引号:

stats='[
            {"name": "hp", "value": 60},
            {"name": "cost", "value": 60},
            {"name": "ene", "value": 90},
            {"name": "str", "value": 90},
            {"name": "wis", "value": 75},
            {"name": "def", "value": 95},
            {"name": "man", "value": 90},
            {"name": "agi", "value": 100}
]'

您需要提示stats属性的类型,以便Polymer知道它需要将其转换为数组。从noscript元素中删除monster-form属性并添加created处理函数:

<script>
    Polymer('monster-form', {
        created: function() {
            this.stats = [];
        }
    });
</script>

现在,Polymer会将stats属性字符串转换为数组(对象)。