2015-02-05 148 views
3

我想了解如何干将观察到的工作时,他们使用其他类实例的属性@observable:飞镖:干将

当我绑定的隐式getter/setter方法对“名”它在输入和更新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

您需要通知聚合物该值取决于的值已更改。

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 – 2015-02-05 15:23:28

+0

+乔纳斯凯洛 - 从您的链接复制:没关系。但是可能更好的是拥有@observable。如果有人试图列举一组可观察的属性,他们也可以找到你的属性。这只是额外的元数据,所以如果你的应用程序没有枚举这样的属性,你可以放心的离开它。 ChangeNotifier不关心:) – 2015-02-05 15:27:54

+0

谢谢,在第一种方式使用符号,但在第二个值,这是正确的?所以如果这个值更加复杂,我仍然需要把它作为注释的参数。 – 2015-02-05 17:58:42

1

君特格拉斯的提案中的一些细微调整,使其为我工作:

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); 
    } 
}