Hi,
Answering myself (and yes, thanks to StackOverflow) -- dom-repeat can't
deal with native types. I changed it into objects, and it worked.
Sorry about the noise!
Merc.
On Thursday, 16 March 2017 00:43:52 UTC+8, Tony Mobily wrote:
>
> I am trying to improve an existing module so that I can send a nice PR to
> them. However, I am getting stuck.
> Basically, when I try to change the values of the _stars array using
> `this.set('_stars.' + i, value )`, dom-template seems to display things in
> a seemly random fashion.
>
> The module's original author solved the problem by reassigning the whole
> array. At the beginning I though that they must have ignored Polymer's
> ability to change index values of an array. Now I wonder if they
> encountered the same type of weirdness...
>
> If you use the original `_updateStars`, you will see that nothing works.
> Using the one marked as `__updateStars`, everything works _precisely_ as
> expected.
>
> The weirdness must have a pattern, but I couldn't work it out.
>
> Please tell me I am missing something obvious!
>
>
>
> <link rel="import" href="../polymer/polymer.html">
> <link rel="import" href="../paper-icon-button/paper-icon-button.html">
> <link rel="import" href="../iron-icons/iron-icons.html">
> <link rel="import" href="../iron-icon/iron-icon.html">
>
> <dom-module id="star-rating">
> <template>
> <style>
> iron-icon {
> color: var(--star-color, #4775D1);
> }
> paper-icon-button {
> color: var(--star-color, #4775D1);
>
> --paper-icon-button-disabled: {
> color: #4775D1;
> };
> }
> [score] {
> @apply(--layout-horizontal);
> @apply(--layout-center);
> }
> </style>
> <div score>
> HERE: {{_o(_stars,_stars.*)}} EH
> <template id="domRepeat" is="dom-repeat"
> items="{{_stars}}" as="star">
> {{star}}
> <template is="dom-if" if="[[readOnly]]">
> <iron-icon icon="{{star}}"></iron-icon>
> </template>
> <template is="dom-if" if="[[!readOnly]]">
> <paper-icon-button id="item-{{index}}"
> on-click="_updateRate" icon="{{star}}"></paper-icon-button>
> </template>
> </template>
>
> <template is="dom-if" if="[[readOnly]]">
> <content select='[votes]'></content>
> </template>
> </div>
> </template>
> <script>
> Polymer({
> _o: function(o ){
> return JSON.stringify( o );
> },
>
> is: "star-rating",
>
> observers: [
> '_updateStars(rate)'
> ],
> properties: {
> _stars: {
> type: Array,
> value: function() { return ["star", "star",
> "star-half", "star", "star-border"]; },
> },
> // number of stars assigned for score
> rate: {
> type: Number,
> value: 0
> },
> // show votes and disble scoring option
> readOnly: {
> type: Boolean,
> value: false
> }
> },
> _updateRate: function (e) {
> var id = parseInt( e.currentTarget.id.split('-')[1] );
> this.rate = id + 1;
> },
>
> _updateStars: function (rate) {
> var intPart = Math.floor(rate);
> var decimalPart = rate % 1;
> debugger;
> for (var i = 0; i < 5; i++) {
> this.set('_stars.' + i, (i < intPart) ? 'star'
> : 'star-border' ) ;
> }
> if (decimalPart >= 0.5) this.set('_stars.' + intPart,
> "star-half" );
> },
>
> __updateStars: function (rate) {
> var intPart = Math.floor(rate);
> var decimalPart = rate % 1;
> debugger;
> for (var i = 0; i < 5; i++) {
> //this.set('_stars.' + i, (i < intPart) ?
> 'star' : 'star-border' ) ;
> this._stars[ i ] = (i < intPart) ? 'star' :
> 'star-border' ;
> }
> if (decimalPart >= 0.5) this._stars[ intPart ] =
> "star-half";
>
> var array = this._stars;
> this._stars = [];
> this._stars = array;
> },
>
> });
> </script>
> </dom-module>
>
>
Follow Polymer on Google+: plus.google.com/107187849809354688692
---
You received this message because you are subscribed to the Google Groups
"Polymer" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/polymer-dev/793345fd-38e9-463e-a214-08d6d7b09199%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.