2014-11-14 2 views
7

Чтобы изолировать отдельные изолирующие элементы из полимера, я хотел бы иметь возможность передавать литералы js для некоторых атрибутов, которые обычно поступают из родительских элементов. Мне сложно понять, как это сделать. См. Этот примерный код. Если бы он работал так, как мне бы хотелось, он отображал бы 1 и 2 рядом друг с другом, но это не сработало.Как передать литералы объектов как атрибуты полимеров

<script src="http://www.polymer-project.org/webcomponents.js"></script> 
 
<link rel="import" href="http://www.polymer-project.org/components/polymer/polymer.html"> 
 

 
<polymer-element name="my-element" attributes="stuff"> 
 
    <template> 
 
    {{stuff.one}} {{stuff.two}} 
 
    </template> 
 
    <script> 
 
    Polymer('my-element', { 
 
     ready: function() { 
 
     console.log(this.stuff); 
 
     } 
 
    }); 
 
    </script> 
 
</polymer-element> 
 
<my-element stuff='{"one": 1, "two": 2}'></my-element>

ответ

9

Полимер только преобразует текст JSON в объект, если инициализировать stuff свойство с пустой хэш:

Polymer('my-element', { 
    stuff: {}, 
    ready: function() { 
     console.log(this.stuff); 
    } 
}); 

Без этого атрибута stuff передается в как строка. То же самое касается массивов.

+0

Любая идея, как сделать это, не зная имени атрибута? –

+0

Не добавляйте вещи: {} напрямую, но используйте объявленные свойства и значение по умолчанию. И используйте функцию, возвращающую объект, иначе все экземпляры вашего элемента будут разделены одним и тем же объектом. – Overclocked

3
index.html 
... 
    <body unresolved fullbleed layout vertical> 
    <my-post info='{"name":"Alex","id":"123"}' posts='[{"id":"456","name":"post1"},{"id":"789","name":"post2"}]'></my-post> 
    </body> 
    ... 

my-post.html 
    <link rel="import" href="../../bower_components/polymer/polymer.html"> 
    <polymer-element name="my-post" attributes="info posts" > 
     <template> 

     {{info.name}} 
     <template repeat="{{post in posts}}"> 
       <br> {{post.id}} - {{post.name}} 
     </template> 

     </template> 
    <script> 
    (function() { 
     Polymer({ 
     ready: function() { 
     this.info=JSON.parse(this.info) 
     this.posts=JSON.parse(this.posts) 
    }, 
    }); 
    })(); 
    </script> 
</polymer-element> 
+0

Как этот, как я в конечном итоге основывая свой компонент на этом объяснении. +1 – leeroya

5

Другой способ сделать это:

myElem.html

<link rel="import" 
     href="http://www.polymer-project.org/1.0/samples/components/polymer/polymer.html"> 

<dom-module id="my-element"> 
    <template> 
     <div> {{stuff.one}} {{stuff.two}} </div> 
    </template> 

    <script> 
     Polymer({ 
      is: "my-element", 
      properties: { 
       stuff:{ 
        type: Object, 
        value: {"one":"default_1","two":"default_2"} 
       } 
      } 
     }); 
    </script> 
</dom-module> 

index.html

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <script src="http://www.polymer-project.org/1.0/samples/components/webcomponentsjs/webcomponents-lite.js"></script> 
    <link rel="import" href="myElem.html"> 
    </head> 
    <body> 
    <my-element></my-element> 
    <my-element stuff={"one":"1","two":"2"}></my-element> 
    </body> 
</html> 

Результат

default_1 default_2 
1 2 
+0

в основном повторение вышеупомянутого, но приятного примера. – leeroya

Смежные вопросы