【问题标题】:Programmatically setting the PaperItem label of a core-dropdown element以编程方式设置核心下拉元素的 PaperItem 标签
【发布时间】:2014-09-07 18:42:01
【问题描述】:

我有以下 core-elements 下拉元素,其中我使用 paper-item 而不是 core-item 来显示下拉标签。

// .html

  <input required
    id='birthday'
    name='birthday'
    type='date'
    value="{{age.birthday}}"
    on-change='{{inputHandler}}'>

<div layout horizontal>
  <div layout vertical self-center
    id='years-div'>Years
    <core-dropdown  disabled
      id='years-core-ddwn'
      halign="left"
      label='0'
      valueattr="label">
      <template repeat="{{year in yearsList}}">
        <paper-item id='years-ppr-itm' label="{{year}}"></paper-item>
      </template>
    </core-dropdown>
  </div>

//.dart

var yearsList = <int>[ 1, 2, 3, 4]
@observable int year = 0;

class Age
{
  int years = 0;
  String birthday = '';     
} 


// calcualate age in years
      void inputHandler()
      {
        if ( age.birthday != '' )
        {
          DateTime now = new DateTime.now();
          DateTime birthday = DateTime.parse( age.birthday.replaceAll( r'-', '') );

          //Duration dayz = ( birthday.difference( new DateTime.now() ) ).inDays;
          Duration duration = new DateTime.now().difference( birthday );

          // calculate years since birth
          int days = duration.inDays;
          age.years = days ~/ 365;

      // attempting to set the PaperItem label to the calculated age
          yearsPprItm = $[ 'years-ppr-itm' ] as PaperItem;

          // neither of the following resets the PaperItem label to the age variable
          yearsPprItm.setAttribute( 'label', age.years.toString() );
          //year = age.years.toString();
    }  

下拉菜单正常显示,所选项目也正常检索。
没有错误堆栈跟踪,但使用 setAttribute 或将 age.years 分配给标签绑定到的可观察年份不会更改纸质项目标签。

我想知道绑定到迭代器变量是否非法。如果是这样,完成我想做的事情的正确方法是什么。

谢谢

【问题讨论】:

    标签: dart dart-polymer


    【解决方案1】:

    据我所知,你不能期待这一年

    <template repeat="{{year in yearList}}">
    

    绑定到

    @observable int year;
    

    我认为模板中的年份是本地创建的变量,与您在支持类中创建的可观察年份无关。不过,我必须查阅文档以获得更好的解释。

    让模板绑定到年份的唯一方法是更改​​

    <template repeat="{{year in yearList}}">
        <paper-item label="{{year}}"></paper-item>
    </template>
    

    <template repeat="{{id in yearList}}">
        <paper-item label="{{year}}"></paper-item>
    </template>
    

    这样的问题是,当年份更新时,它会在每个显示中更新为相同的值。我想你想要的是这样的

    <template repeat="{{ year in yearList }}">
        <paper-item label="{{year.years}}"></paper-item>
    </template>
    

    支持 yearList 是

    List<Age> yearList = [new Age(0), new Age(1), ...];
    

    年龄

    class Age extends Observable {
        @observable int years;
        String birthday = '';
    
        Year(this.year);
    }
    

    然后您可以更新列表中的项目,更改将反映在显示中。至少那是我认为你所追求的。我相信还有其他方法可以做到这一点以及我的建议。除非我也不明白你在追求什么。

    【讨论】:

      【解决方案2】:

      编辑

          <core-dropdown  disabled
                          id='years-core-ddwn'
                          halign="left"
                          label='0'
                          valueattr="label" selected="{{age.years}}"> <!-- added `selected` attribute -->
            <template repeat="{{year in yearsList}}">
              <paper-item label="{{year}}"></paper-item> <!-- don't add static id in <template repeat> -->
            </template>
          </core-dropdown>
      

      使 Age 类可观察,以便 &lt;core-dropdown&gt; 选择自动更新。

      class Age extends Observable {
        @observable
        int years = 0;
        String birthday = '';
      }
      

      旧答案

      这不行:

        <template repeat="{{year in yearsList}}">
          <!-- for each item in yearsList a paper-item with the id 'years-ppr-itm' is created
               but 'id' is supposed to be unique. -->
          <paper-item id='years-ppr-itm' label="{{year}}"></paper-item>
        </template>
      

      您只需修改yearsList 列表以包含您想要的年份值,并且项目会自动更新。

      您需要更改代码以使其正常工作:

      改变

      var yearsList = <int>[ 1, 2, 3, 4];
      

      var yearsList = toObservable(<int>[ 1, 2, 3, 4]);
      

      toObservable() 通知 Polymer 添加/删除列表项。
      如果您将另一个列表分配给 yearsList 而不是添加删除值,您需要这样做

      // declaration/initialization
      @observable
      var yearsList = toObservable(<int>[ 1, 2, 3, 4]);
      
      ...
      
      // later assignment of a new list
      yearsList = toObservable(<int>[ 5, 6, 7, 8]);
      

      如果您不修改列表元素并始终将新列表分配给yearsList,您可以省略toObservable(),但不能省略@observable

      【讨论】:

      • 与其说是显示一个新列表或者删除或添加到列表中,不如说是选择与计算的年龄相当的列表项。所以,如果年龄计算为4,我想在列表中显示4,而不是创建列表时默认的0。
      • &lt;paper-item&gt;s 只是可供选择的列表。所选元素由&lt;core-dropdown&gt;selected 属性定义。我会更新我的答案。
      • 我在发布问题之前尝试了更新的建议 - 它没有用。根据你的建议,我又试了一次,还是不行。我想知道所选元素是否是最终元素,并且仅在下拉菜单初始化时发生。
      • 也许我还是没明白你想要完成什么。
      猜你喜欢
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多