【问题标题】:How to bind an AngularJS variable as a Polymer global?如何将 AngularJS 变量绑定为 Polymer 全局变量?
【发布时间】:2014-10-18 14:58:59
【问题描述】:

我在 Angular 控制器中有一个具有一些属性的对象变量。我想创建一系列聚合物元素,以该变量作为属性名称并以特定格式(取决于类型和其他属性)显示它们。类似于下一个示例:

<polymer-element name="x-property" attributes="data property">
    <template>
        {{data.labels[property]}}: {{data[property]}}
    </template>
    <script>
        Polymer('x-property', {            
           data: {}
        });
    </script>
</polymer-element>

然后我就这样使用它:

<x-property data="{{person}}" property="firstName"></x-property>

效果很好。但是现在我想避免在所有元素中指定属性数据。阅读 Polymer 文档,我发现可以有全局变量。我按照示例创建了 app-globals 元素,如 api 指南中所示,但是当我尝试访问该属性时,我得到的不是对象“person”,而是文本“{{person}}”

<polymer-element name="app-globals" attributes="values">
    <script>
        (function () {
            var values = {};

            Polymer('app-globals', {
                ready: function () {
                    this.values = values;
                    for (var i = 0; i < this.attributes.length; ++i) {
                        var attr = this.attributes[i];
                        values[attr.nodeName] = attr.value;
                    }
                }
            });
        })();
    </script>
</polymer-element>

<polymer-element name="x-property" attributes="property">
    <template>
        <app-globals id="globals" values="{{globals}}"></app-globals>
        {{globals.data.labels[property]}}: {{globals.data[property]}}
        {{globals.data}}
    </template>
    <script>
        Polymer('x-property', {
        });
    </script>
</polymer-element>

所以在我的 html 中我有:

<app-globals data="{{person}}"></app-globals>
<x-property property="firstName"></x-property>

而我得到的结果是这样的:

:
{{person}}

我是否可以像在第一个示例中那样工作?

【问题讨论】:

    标签: javascript angularjs polymer globals


    【解决方案1】:

    因为属性只是字符串,此代码values[attr.nodeName] = attr.value; 无法捕获您的对象值数据。相反,JavaScript 将您的对象转换为字符串,这就是您看到 [Object object] 的原因。

    捕获带有胡须的对象 ({{ }}) 是一种特殊的 Polymer 功能,您可以通过将属性发布作为属性(或将其列在 publish 中的映射中原型)。

    如果我们不是将app-globals 设为通用,而是直接发布valuesdata,那么我们可以让它像这样工作:

    <polymer-element name="app-globals" attributes="values data">
      <script>
        (function () {
          var values = {};
          Polymer('app-globals', {
            created: function() {
              this.values = values;
            },
            dataChanged: function() {
              this.values.data = this.data;
            }
          });
        })();
      </script>
    </polymer-element>
    
    <polymer-element name="x-property" attributes="property">
      <template>
        <app-globals values="{{globals}}"></app-globals>
        {{globals.data.labels[property]}}: {{globals.data[property]}}
        {{globals.data | json}}
      </template>
      <script>
        Polymer('x-property', {
          json: function(s) {
            return JSON.stringify(s);
          }
        });
      </script>
    </polymer-element>
    

    您的原始代码没有 json 过滤器,否则我们再次要求 Javascript 将对象放入字符串上下文中,它将呈现 [Object object]

    http://jsbin.com/vusayo/10/edit

    【讨论】:

    • 好吧...我一直在玩你的例子。虽然我必须做一些改变,因为 {{person}} 我正在做的事情来自 AngularJs 控制器的范围。我所做的唯一更改是在 dataChanged 事件中: dataChanged: function() { this.values.data = JSON.parse(this.data); } jsbin.com/tejolekokige/2/edit
    • Fwiw,如果你把 data: {} 放在你的 app-globals 原型中,这告诉 Polymer 你需要一个对象,Polymer 会为你做 JSON.parse。 jsbin.com/tejolekokige/3/edit
    • 呃……我忘了。再次感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多