2015-11-05 52 views
1

我尝试在dom-repeat助手使用计算的属性,但它会立即抛出异常后,我点击按钮(请参见下面的代码,包版本:sdk: 0.12.2polymer: 1.0.0-rc.5polymer_interop: 1.0.0-rc.4+1)。什么可能是错的?当我替换{{computedItems}}{{items}}一切工作正常。计算属性不起作用

class Item extends JsProxy{ 
    @reflectable 
    String a="aaa aaa"; 
    @reflectable 
    String b="bbb bbb"; 
    Item(this.a, this.b); 
} 

@PolymerRegister('main-app') 
class MainApp extends PolymerElement { 

    @Property(computed:"getItems(items.*)") 
    List<Item> computedItems; 

    @property 
    List<Item> items = []; 

    @property 
    String inp = ''; 

    MainApp.created() : super.created(); 


    @reflectable 
    List<Item> getItems(_) { 
     return items; 
    } 

    @reflectable 
    void onTap(Event ev, Map details) { 
     add("items", new Item(inp, 'aa')); 
     set("inp", ""); 
    } 

} 

html文件:

<dom-module id="main-app"> 
    <template> 

     <paper-input value="{{inp}}"> </paper-input> 
     <paper-button raised on-tap="onTap">add to list</paper-button> 

     <template is="dom-repeat" items="{{computedItems}}"> 
      <div style="color:red"> 
       <span>[[item.a]]</span> 
       <span>[[item.b]]</span> 
      </div> 
     </template> 

    </template> 
</dom-module> 
+0

没有尝试,我认为它是'。*'在'项目*'。尝试只是'项目' –

+0

我使用通配符,因为我想观察'Item'字段中的更改。无论如何,我已经将'items。*'改为'items',它仍然会抛出。 – kolar

+0

我只是现在试图重现,我也遇到过,它不承认更改。我将其更改为'items',并且不再收到错误消息。你有使用“计算”​​的原因吗?至少在你的问题的最小例子中,它不是必需的。 –

回答

1

你可以这样来做:

@PolymerRegister('app-element') 
class AppElement extends PolymerElement { 
    AppElement.created() : super.created(); 

    @property 
    List<Item> computedItems; 

    @property 
    List<Item> items = []; 

    @Observe('items.*') 
    void computeItems([_, __]) { 
    set('computedItems', items.toList()); 
    // .toList() creates a copy, otherwise Polymer wouldn't 
    // recognize it as a change 

    // this works as well 
    // set('computedItems', null); 
    // set('computedItems', items); 
    } 

    @property int itemsChangeIndicator = 0; 

    @property 
    String inp = ''; 

    @reflectable 
    List<Item> getItems(_) { 
     return items; 
    } 

    @reflectable 
    void tapHandler(dom.Event ev, Map details) { 
    add("items", new Item(inp, 'aa')); 
    set("inp", ""); 
    } 
} 

(我改名onTap因为这个命名方案很容易在元素事件流干将相撞,像onClick