dart:无法从事件处理程序设置属性

dart:无法从事件处理程序设置属性,dart,polymer,dart-polymer,Dart,Polymer,Dart Polymer,以下代码不起作用。也许我做错了什么。。请更正我的代码: index.html: 页 点击我 导入'dart:html'; 进口“包装:聚合物/聚合物.dart”; 导入“msg_box.dart”; void main(){ initPolymer(); ButtoneElement btn=查询选择器(“btn”); btn.onmouseinter.listen((e){ MsgBoxElement elm=查询选择器(“msg”); window.alert(elm.caption);

以下代码不起作用。也许我做错了什么。。请更正我的代码:

  • index.html:
  • 
    页
    点击我
    
    导入'dart:html';
    进口“包装:聚合物/聚合物.dart”;
    导入“msg_box.dart”;
    void main(){
    initPolymer();
    ButtoneElement btn=查询选择器(“btn”);
    btn.onmouseinter.listen((e){
    MsgBoxElement elm=查询选择器(“msg”);
    window.alert(elm.caption);//显示“caption 1”
    elm.caption=“caption 2”//不要工作!
    window.alert(elm.caption);//显示“caption 2”,但页面显示“caption 1”!!!
    });`
    }
    
  • msg_box.html
  • 
    {{caption}}
    
    import'包装:polymer/polymer.dart';
    @CustomTag('msg-box')
    类MsgBoxElement扩展了聚合关系{
    //田地
    字符串标题;
    字符串get caption=>\u caption;
    无效集标题(字符串值){
    _caption=notifyPropertyChange(#caption,_caption,value);
    }
    MsgBoxElement.created():super.created(){
    }
    }
    

    这个问题对我来说至关重要。另请参见

    根据您的信息,似乎模型正在更新,但DOM没有更新,很可能是因为未设置可观察元素。尝试将以下注释添加到您的
    msg\u框中
    dart代码:

    import'包装:polymer/polymer.dart';
    @CustomTag('msg-box')
    类MsgBoxElement扩展了聚合关系{
    //田地
    @可观察字符串_标题;
    @可反射字符串get caption=>\u caption;
    @可反射的空集标题(字符串值){
    _caption=notifyPropertyChange(#caption,_caption,value);
    }
    MsgBoxElement.created():super.created(){
    }
    }
    

    请参见dart邮件列表中有关属性的内容。另请参见关于设置getter的部分

    我认为这里的问题在于,由于您的代码未在脏检查区域中运行,因此存在未处理的挂起更改通知。要解决此问题,您可以做两件事:

    • 更新到
      标题后立即调用
      Observable.dirtyCheck()
      ;或者
    • 在脏检查区域内运行代码:
    void main(){
    var dirtyCheckingZone=initPolymer();
    dirtyCheckingZone.run(){
    ButtoneElement btn=查询选择器(“btn”);
    btn.onmouseinter.listen((e){
    MsgBoxElement elm=查询选择器(“msg”);
    elm.caption=“caption 2”;
    });
    });
    }
    
    此区域确保在执行任何回调或侦听器后,我们将为您调用Observable.dirtyCheck。这种方法比显式调用dirtyCheck要好一些,因为在编译部署时,我们会从脏检查切换到显式通知。initPolymer返回的区域将更改以反映这一点

    另请注意:如果使用
    @published
    注释,则可以简化上面的MsgBoxElement。这意味着一个属性既是可观察的,也是作为元素属性公开的

    import'包装:polymer/polymer.dart';
    @CustomTag('msg-box')
    类MsgBoxElement扩展了聚合关系{
    @已发布的字符串标题;
    MsgBoxElement.created():super.created();
    }
    
    不幸的是,这在当前版本的dart polymer(0.8.10)中不起作用。谢谢!第一种方法很好用。第二个返回null(方法run)。因此我得到了一个例外。发现了相同的问题。。我建议避免使用您自己的
    main()
    ,继续使用
    polymer/init.dart
    ,然后使用
    @CustomTag('msg-box')
    和/或
    @initMethod
    调用您自己的方法。。还记得在
    @CustomTag
    之前调用
    @initMethod
    吗?…使用脏检查区运行代码有哪些缺点?有其他选择吗?更具哲理的是:为什么不能为从polymerement继承的类创建合适的构造函数?