2014-10-11 5 views
1

Поэтому у меня есть общая библиотека с некоторыми моделями я намерен использовать на сервере, а также клиент:PolymerDart: Привязка данных шаблонов со сложными моделями

library models; 

class Model { 
    String id; 
} 

class Theatre extends Model { 
    String name; 
    // implements List<E> 
    CustomCollection<Movie> movies = new CustomCollection(); 

    Theatre(this.name); 
} 

class Movie extends Model { 
    String name; 
    Movie(this.name); 
} 

У меня есть полимерный элемент, как это:

<polymer-element name="my-app"> 
    <template> 
    <movie-list movies="{{theatre.movies}}"></movie-list> 
    <button on-click="{{moreMovies}}">More movies!</button> 
    </template> 
    <script type="application/dart" src="my_app.dart"></script> 
</polymer-element> 

с помощью следующего кода позади:

import 'package:polymer/polymer.dart'; 
import 'package:my_app/models.dart'; 

@CustomTag('my-app') 
class MyApp extends PolymerElement { 
    @observable theatre = new Theatre('Lucky Seven Cinema'); 

    void moreMovies(event, detail, sender) { 
    theatre.movies.add(new Movie('The Goonies')); 
    } 
} 

PolymerDart, похоже, не меняет мои изменения свойств: после загрузки начальной страницы, изменения имени файла или добавления или удаления элемента из theatre.movies не приводит к обновлению привязок. В документации Полимера указано, что expressions are re-evaluated when the value of one or more paths in an expression changes.

Если я иду в models библиотеку и добавить @observable всех своих свойств модели, PolymerDart кажется, чтобы забрать изменения, но теперь я добавил новую зависимость в мою библиотеку моделей - и я хочу эту библиотеку для работы как на клиенте, так и на сервере, поэтому мне не нужно дублировать мою логику.

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

Я предполагаю, что я делаю что-то неправильно здесь: что это?

ответ

1

Классы моделей должны быть расширены Observable, а свойства нуждаются в аннотации @observable. См. Observe package from polymer dart для более подробной информации.

class model extends Observable { 
    ... 
} 

class Theatre extends Model { 
    @observable 
    String name; 
} 

Я не могу сказать, как реализация вашего CustomCollection выглядит, но если он содержит встроенный список или карту, которую вы должны инициализировать его как List backingList = toObservable([]); так Polymer получает уведомление, когда добавляются элементы/удалены.

+0

'CustomCollection' не генерирует события изменения, если я расширяю Observable и добавляю аннотацию @observable в список поддержки. Разумеется, список поддержки. Я посмотрел исходный код PolymerDart и, по-видимому, они обрабатывают ObservableList иначе; вы не можете проксировать события ObservableList, потому что их не будут слушать. – ALW

+0

После долгих исследований я решил, что нет другого способа, кроме как заразить разделяемые библиотеки с помощью @observable. – ALW

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