Программно уведомлять Observable-Watchers в Dart

Еще раз, вопрос, связанный с Dart/Polymer.

Я хотел использовать библиотеку JavaScript Parse.com, но, поскольку она недоступна в Dart, я написал классы-оболочки, которые хранят JsObject и делегируют все вызовы из Dart соответствующему объекту JavaScript. В основном это как прокси.

Угадайте, что это работает очень здорово.

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

class ParseObject extends Observable {

   JsObject _jsDelegate = new JsObject(context['Parse']['ParseObject']);

   void set(String key, dynamic value) {
      _jsDelegate.callMethod('set', [key, jsify(value)];
   }

   dynamic get(String key) {
      return dartify(_jsDelegate.callMethod('get', [key]));
   }

}

HTML-код моего Polymer Element выглядит так:

<div>Name: {{project.get('name')}}</div>

Поскольку привязка данных оценивается только в случае изменения параметра метода, он никогда не будет обновляться, и поэтому даже при изменении имени старое останется на месте.

Решение, которое я придумал, состоит в том, чтобы сохранить все значения, которые пользователь устанавливает в методе ParseObject#set(String, dynamic) в карту, которую можно наблюдать. Это работает, но я думаю, что это грязно, так как я должен убедиться, что обе карты, та, что в Dart, и та, что в представлении JavaScript ParseObject, равны.

Таким образом, я ищу лучшее решение и думаю о каком-то методе, чтобы сказать Polymer переоценить свои привязки данных.

Существует ли такой метод или есть какие-либо другие возможности для решения этой проблемы?


person Basic Coder    schedule 17.04.2015    source источник


Ответы (1)


Расширение наблюдаемого само по себе еще ничего не делает. Вам нужно аннотировать геттеры с помощью @observable (и если вы не используете Polymer, вам также нужно добавить наблюдаемый преобразователь в pubspec.yaml). Вы не можете сделать функции наблюдаемыми (это работает в элементах Polymer, но не в классах моделей Observable. Дополнительные сведения о наблюдаемых см., например, в Реализовать шаблон Observer в Dart или Dart: @observable геттеров

person Günter Zöchbauer    schedule 17.04.2015
comment
Я использую Polymer, но мой ParseObject не является PolymerElement. Добавление @observable к геттеру ничего не изменило. Я придумал довольно другое решение, которое работает. Я расширяю ObservableMap и переопределяю оператор [ ] для вызова метода get моего ParseObject. Всякий раз, когда вызывается set(String, dynamic) моего ParseObject, я вношу изменения, вызывая notifyPropertyChange для свойства, которое использует расширенную карту. Все еще не лучшее решение, но я чувствую себя довольным этим. Спасибо за ответ, хотя вы буквально отвечаете на ВСЕ мои вопросы менее чем за 20 минут. - person Basic Coder; 17.04.2015
comment
Я попробую :-). Ваш get - это функция, а не геттер, поэтому @observable не работает. вы, вероятно, могли бы сделать то же самое с классом (вызовите notifyPropertyChange)`, но вам нужно будет изменить свой код, чтобы иметь геттер вместо функции. Возможно, было бы целесообразно включить поле @observable и использовать его в списке аргументов функции, а также вызвать notifyPropertyChange для этого поля. - person Günter Zöchbauer; 17.04.2015
comment
Да, добавление @observable перед моим методом get(String) и вызов notifyPropertyChange(#get, ...) работает. Таким образом, я избавляюсь от этой хакерской карты, которую я расширил. Большое спасибо! - person Basic Coder; 17.04.2015