2015-10-31 3 views
3

Работа с железным списком в дротике Polymer 1.0. Попробуйте реализовать железный список с выбором элемента в списке. Это работает, когда элемент является строкой, но не работает для структурированного типа.Polymer 1.0 - железный список - выбор

При запуске кода нижеприведена следующая распечатка.

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

точек останова внутри (objText! = NULL) список "objText-> JavaScriptView->прото> получить/установить shorttext" Close, но предполагая, что-то неправильно с привязкой.

В документации по железным спискам упоминается что-то о том, как положить действие на предмет. Пример JavaScript в документации имеет выбор и использует модель.

https://elements.polymer-project.org/elements/iron-list

Когда верно, нажав строку будет выбрать элемент, помещая его модель данных в наборе выбранных элементов извлекаемых с помощью свойства выбора.

Обратите внимание, что нажатие фокусируемых элементов в элементе списка не приведет к выбору, поскольку предполагается, что они имеют собственное действие.

Хорошо, кто-нибудь был в подобных частях dart-polymer 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> 

На Dart стороне:

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 к собственности и введите код, если значение selectedItem изменится для этой цели, вместо события on-tap.

`<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 решила, как действовать. Если это ответит на ваши вопросы, отметьте это, как указано с помощью галочки под кнопками «вверх», спасибо! –

+1

У вас есть точка. Я сообщу об этом, также в iron_list.dart есть get для selectedItem, поэтому для меня он должен вернуть четко определенный объект Dart. –

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