2015-02-05 2 views
3

я пытаюсь понять, как наблюдаемые добытчики работают, когда они используют другие свойства экземпляра класса:Dart: @observable геттеров

Когда я связать/сеттер пару «имя» неявного геттер он обновляет на входе и в div и все синхронизировано красиво.

Однако явное getter 'fullname' не обновляется в HTML. Есть ли способ сделать эту работу (в основном, «полное имя» в привязке элемента также должно обновляться)? Может быть, мне не хватает сеттера, но затем снова сеттер не имеет смысла здесь ...

Очень простой пример, чтобы продемонстрировать:

тест-element.html

<link rel="import" href="../../packages/polymer/polymer.html"> 
<polymer-element name="test-element"> 
    <template> 
    <input value="{{ds.name}}"> 
    <div>{{ds.name}}</div> 
    <div>{{ds.fullname}}</div> 
    </template> 
    <script type="application/dart" src="test1.dart"></script> 
</polymer-element> 

тест-элемент .dart

import 'package:polymer/polymer.dart'; 
import 'package:popoli/sysmaster-settings.dart'; 

@CustomTag('test-element') 
class TestElement extends PolymerElement { 
    @observable VerySimpleTest ds; 

    TestElement.created() : super.created() { 
    ds = new VerySimpleTest()..name = 'Peter'; 
    } 
} 

ds.dart

class VerySimpleTest extends Observable { 
    @observable String name = ''; 
    @observable String get fullname => 'Test: $name'; 
    VerySimpleTest() : super(); 
} 

ответ

3

Вам необходимо уведомить Polymer о том, что значение изменилось.

String set name(String val) { 
    name = notifyPropertyChange(#fullname, name, val); 
} 

или это должно работать слишком

@ComputedProperty('Test: $name') String get fullname => 'Test: $name'; 

См http://japhr.blogspot.co.at/2014/08/the-polymerdart-computedproperty.html для более подробной информации.

+1

Также интерес, когда вы звоните notifyPropertyChange явно, вам не нужно добавлять @observable аннотаций (и, таким образом, вы не не нужно, чтобы трансформатор работал). См. Https://groups.google.com/a/dartlang.org/forum/#!topic/web/007Ij-l_hf4 –

+0

+ Jonas Kello - скопировано из вашей ссылки. Все в порядке. Но лучше иметь @observable. Если кто-то пытается перечислить множество наблюдаемых свойств, они также могут найти ваш. Это просто дополнительные метаданные, поэтому, если ваше приложение не перечисляет такие свойства, вы можете спокойно оставить его. ChangeNotifier не заботится :) –

+0

спасибо, в первую очередь, этот символ используется, но во втором - это правильно? поэтому, если значение намного сложнее, мне все равно нужно иметь его, как и в параметре аннотации? –

1

некоторых незначительных адаптаций по предложению Gunter делают его работу для меня:

class VerySimpleTest extends Observable { 
    String _name = ''; 
    // @observable // apparently, not even required 
    String get name => _name; 
    // @observable // apparently, not even required 
    String get fullname => 'Test: $name'; 

    set name(String val) { 
     String oldVal = _name; 
     _name = notifyPropertyChange(#name, oldVal, val); 
     _name = notifyPropertyChange(#fullname, oldVal, val); 
    } 
}