Dart:使用带有多个getter / setter的observable

时间:2014-02-21 17:34:01

标签: dart dart-polymer

对于我的Polymer应用程序,我需要两种不同的observable,例如整数值和字符串值。我使用getter和setter来封装状态和内部表示。通过这样做,我必须为每个setter中的每个observable实现 notifyPropertyChange ,这会导致更多的errorprone管道代码。例如 我需要两次 notifyPropertyChange - 两种口味的陈述,如果我必须使用 4种口味,我必须使用4 * 4 = 16 notifyPropertyChange - 语句。我修改了点击计数器示例来说明这一点:

@CustomTag('click-counter')
class ClickCounter extends PolymerElement {
  int _count;
  @observable int get count => _count;
  @observable set count(int val) {
    notifyPropertyChange(#count,_count,val);
    _count = notifyPropertyChange(#strcount,_count,val);}

  @observable String get strcount { 
    print("TOSTRING "+_count.toString()); 
    return _count.toString();}

  @observable set strcount(String val) { 
    notifyPropertyChange(#strcount,_count,int.parse(val));
    _count = notifyPropertyChange(#count,_count,int.parse(val));}

  ClickCounter.created() : super.created() {
  }

  void increment() {
    count++;
  }
}

在没有那么多 notifyPropertyChange - 声明的情况下,是否有更好的方法来实现它?

问候

马库斯

3 个答案:

答案 0 :(得分:1)

我还没有对它进行过测试,但它应该可行,如果你有更多这样的属性,我认为它的代码要少得多。

@CustomTag('click-counter')
class ClickCounter extends PolymerElement {
  int _count;
  @observable int get count => _count;
  set count(int val) { 
    notifyPropertyChange(#count,_count,val);
    notifyPropertyChange(#strcount, _count.toString(), val.toString());
    _count = val;

  @observable String get strcount { 
    // print("TOSTRING "+_count.toString()); 
    return _count.toString();}

  set strcount(String val) { 
    count = int.parse(val); // set the new value using the setter not the field to fire property change
  }

  ClickCounter.created() : super.created();

  void increment() {
    count++;
  }
}

答案 1 :(得分:1)

如果count属性不需要是私有的 - 根据Dart style guide需要考虑的事项 - 这种情况可以选择一个甜蜜的选项。

class ClickCounter extends PolymerElement {
    @observable int count;
    ...
    void countChanged(oldValue) {
        // do something...
    }
}

可观察属性发生的更改会自动在名为<property_name>Changed的方法上传递,其中property_name引用要侦听的属性。

希望这有助于为编写聚合物组件带来更多乐趣。

答案 2 :(得分:1)

不确定这是否适用于您,但我遇到了同样的问题。在我的情况下,虽然我只用一个属性和一个过滤器来解决它。

dart class

int count;

int asInt(...) // can't remember details of filters

HTML

<input type="text">{{count | asInt}}<input>

对代码不正确的道歉。我在手机上,没有时间搜索代码。希望你能得到这个想法

干杯 安德斯