聚合函数绑定在html中,对象作为第二个参数

时间:2016-06-15 17:26:52

标签: javascript data-binding polymer

我遇到了Polymer 1.x的一个问题,我正在创建一个自定义本地化元素。当绑定到HTML中的函数时,我似乎无法将参数作为对象传递。 my-element textContent将整个函数作为字符串,而不是函数返回的值。请参阅下面的示例代码以获取示例或此jsfiddle:https://jsfiddle.net/4n2da6sr/1/

HTML:

<dom-module id="x-example">
    <template>
      <h1>[[getText('Hello world', {context: 'general'})]]</h1>
    </template>
</dom-module>

<x-example></x-example>

JavaScript的:

let strings = {
    general: {
      'Hello world': {
      message: 'Hola Mundo'
    }
};

Polymer({
    is: 'x-example',
    getText: function(key, options = {context: 'general'}) {
        let context = options.context;
        let localMessage = key;

        if (strings && strings[context][key]) {
            let message = strings[context][key].message;
            localMessage = message || key;
        }

      return localMessage;
    }
});

此getText函数仅返回本地化的消息或键,并使用第二个参数(对象)作为过滤消息的附加选项。所以在上面的例子中,我希望得到一个输出:

"Hola Mundo"

但我将整个函数评估为字符串:

"getText('Hello world', {context: 'general'})"

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

使您的对象成为属性,然后使用它

&#13;
&#13;
let strings = {
    general: {
      'Hello world': {
        message: 'Hola Mundo'
      }
    }
};

Polymer({
  is: 'x-example',
  properties:{
  	options:{
    type:Object,
    value:{context:'general'}
    }
  },
  getText: function(key,options = {context: 'general'}) {
    let context = options.context;
    let localMessage = key;

    if (strings && strings[context][key]) {
      let message = strings[context][key].message;

      localMessage = message || key;
    }

    return localMessage;
  }
});
&#13;
     body {
  font-family: sans-serif;
}
&#13;
<base href="https://polygit.org/components/">
<script src="webcomponentsjs/webcomponents-lite.min.js"></script>
<link href="polymer/polymer.html" rel="import">

<dom-module id="x-example">
  <style>
    :host {
      display: block;
    }
  </style>
  <template>
      <h1>
          [[getText('Hello world',options)]]
      </h1>
  </template>
</dom-module>

<x-example></x-example>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

  

计算绑定类似于计算属性:它包括a   计算函数和零个或多个参数。 参数可以   依赖属性或字符串或数字文字。

https://www.polymer-project.org/1.0/docs/devguide/data-binding#annotated-computed

调用getText()的问题在于,当它只接受字符串,数字和属性时,您传递的是对象文字。

如果您重新构造元素,以便optionsstrings属性,则可以使其正常工作。

<!doctype html>
<html>

<head>
  <meta name="description" content="http://stackoverflow.com/questions/37841958">
  <meta charset="utf-8">
  <base href="http://polygit.org/components/">
  <script href="webcomponentsjs/webcomponents-lite.min.js"></script>
  <link href="polymer/polymer.html" rel="import">
</head>

<body>

  <dom-module id="x-example">
    <template>
      <h1>[[getText('Hello world', options, strings)]]</h1>
    </template>
    <script>
      Polymer({
        is: 'x-example',
        properties: {
          options: {
            type: Object,
            notify: true,
            value: function() { 
              return {'context': 'general'}; 
            }
          },
          strings: {
            type: Object,
            notify: true,
            value: function() { 
              return {
                'general': {
                  'Hello world': {
                    'message': 'Hola Mundo'
                  }
                }
              }
            }
          }
        },
        getText: function(key, options, strings) {
          let context = options.context;
          let localMessage = key;

          if (strings[context][key]) {
            let message = strings[context][key].message;

            localMessage = message || key;
          }

          return localMessage;
        }
      });
    </script>
  </dom-module>

  <x-example></x-example>
</body>

</html>

http://jsbin.com/tagohu/edit?html,console,output