2015-10-31 93 views
3

在飛鏢聚合物1.0中使用鐵名單。嘗試通過選擇列表中的項目來實現鐵列表。這適用於項目是字符串時,但對結構化類型失敗。聚合物1.0 - 鐵名單 - 選擇

運行下面的代碼後,打印輸出得到。

>Contains : false 
>Uncaught Unhandled exception: 
>NoSuchMethodError: method not found: 'shorttext' 
>Receiver: Instance of 'JsObjectImpl' 

斷點內(objText!= NULL)清單 「objText-> JavaScriptView->>獲取/設置shorttext」 關閉,但提示一些錯誤的結合。

鐵列表文件提到了關於對該項目採取行動的內容。文檔中的JavaScript示例有選擇並使用模型。

​​

爲真時,輕敲行將選擇項目,將其數據模型的設定通過選擇屬性檢索選擇的項目。

請注意,點擊列表項中的可聚焦元素不會導致選擇,因爲它們被假定爲有自己的操作。

好的,任何人都進入了飛鏢聚合物1.0的相似部分?也只是建議如何處理選擇的鐵名單是值得歡迎的?

HTML端:

<iron-list id="id_list" items="{{listitem}}" as="item" selection-enabled> 
    <template> 
    <paper-item on-tap="tap_event">{{item.shorttext}}</paper-item> 
    </template> 
</iron-list> 

在飛鏢側:

class ItemText extends JsProxy { 

    @reflectable 
    String shorttext; 
    ItemText(this.shorttext); 
} 

@PolymerRegister('list-demo') 
class ListDemo extends PolymerElement { 

    @property 
    List<ItemText> listitem; 

    @property 
    int nrelements = 10; 

    // Constructor used to create instance of MainApp. 
    ListDemo.created() : super.created(){ 
    List<ItemText> l = []; 

    for (int i = 0; i < nrelements; ++i){ 
     l.add(new ItemText('Name ' + i.toString())); 
    } 

    listitem = l; 
    print('created : ${$['id_list'].selectionEnabled}'); 
    this.notifyPath('listitem', listitem); 
    } 

    @reflectable 
    void tap_event(event, [_]) { 

    IronList e = $['id_list']; 
    Object objText = e.selectedItem; 
    if (objText != null){ 
     print('Contains : ${listitem.contains(objText)}'); 
     print('The short text : ${objText.shorttext}'); 
    } 
    } 

} 

回答

4

改變線

Object objText = e.selectedItem; 

ItemText objText = convertToDart(e.selectedItem); 

我想這是一個錯誤。請報告在https://github.com/dart-lang/polymer-dart

我建議不要使用.created()構造聚合物元素。改爲使用attached()ready()

考慮將selectedItem綁定到屬性,並在爲此目的而不是on-tap事件更改selectedItem值時運行您的代碼。

`<iron-list ... selected-item="{{selectedItem}}">` 
@Property(observer: 'selectedItemChanged') ItemText selectedItem; 

@reflectable 
void selectedItemChanged(newValue, oldValue) { 
    // your code here 
} 

@property ItemText selectedItem; 

@Observe('selectedItem') 
void selectedItemChanged(ItemText newValue) { 
    // your code here 
} 
+0

謝謝,對於響應速度非常快。建議的解決方案有效。 'convertToDart(e.selectedItem);'使邏輯有效。當然,在selectedItem和@Observe方法上綁定的解決方案更好,這裏newValue指向列表中正確的項目,並且不需要任何轉換。我可以將原始問題報告爲一個錯誤,或者至少有更多關於此的文檔。你有什麼建議? –

+0

我會報告錯誤並讓Polymer小組決定如何繼續。如果這回答您的問題,請將其標記爲已答覆,並在upvote按鈕下面的複選標記處,謝謝! –

+1

你有一點。我會報告它,也在iron_list.dart中獲取selectedItem,所以對我來說它應該返回一個明確定義的dart對象。 –