控制纸张复选框的状态

Control a paper-checkbox's state

我正在尝试设置一个内部带有 paper-checkbox 的元素。我希望复选框的选中状态由 ajax 调用的响应控制。

HTML:

<epic-list-episode checked="<%= episode.seen? %>">
  <p><strong><%= episode.show.name %></strong></p>
</epic-list-episode>

自定义元素:

<polymer-element name="epic-list-episode" attributes="checked">

  <template>
    <link rel="stylesheet" href="epic-list-episode.css.scss" />
    <div horizontal layout center>
      <div flex>
        <content></content>
      </div>
      <div vertical layout>
        <paper-checkbox checked?="{{checked === 'true'}}" on-change="{{changeHandler}}"></paper-checkbox>
      </div>
    </div>
  </template>

  <script>
    Polymer({
      changeHandler: function(event) {
        //Send ajax, wait for error/success callback
        //checkbox.checked = response from ajax
      }
    });
  </script>

</polymer-element>

如何实现?我试过 return false 但复选框仍然执行其切换动画。

澄清一下,这是我想要的流程:

  1. 复选框未选中
  2. 我点击了复选框(我还不想让它切换)
  3. Ajax 请求发送完毕
  4. 等待回调
  5. 如果成功,切换复选框的状态

我认为您根本不需要 checked 属性。

你可以做的是,当调用 on-change 时,将 paper-checkboxchecked 属性 设置回其先前的值。然后在 ajax 回调之后,将其设置回应该的状态。

changeHandler: function (event, detail, sender) {
    this.$.checkbox.checked = !this.$.checkbox.checked;

    // give the checkbox a little loading animation
    var loading = new CoreAnimation();
    loading.duration = 750;
    loading.easing = 'ease-in';
    loading.keyframes = [{ opacity: 1, transform: "scale(1)" }, { opacity: 0.4, transform: "scale(0.9)" }];
    loading.direction = 'alternate';
    loading.iterations = '1000';
    loading.target = this.$.checkbox;
    loading.play();

    // give it a little delay to act like a callback
    this.job('delay', function () {
        // stop the animation
        loading.finish();

        this.$.checkbox.checked = !this.$.checkbox.checked;
    }, 3000);
}

请注意,我还包含了一些动画代码,让用户感觉 paper-checkbox 正在做某事,以获得更好的用户体验。请参阅此 jsbin 以获取工作示例。

实际上有几种方法可以解决这个问题。我做了这个 plunker 来展示我做这件事的两种方法。 http://plnkr.co/edit/xqHCSvs63u4bdFJYM6TF?p=preview

使用声明式绑定

<paper-checkbox checked="{{checked}}" on-change="{{changeHandler}}"></paper-checkbox>

在你的脚本中

this.checked = true;

和纯 js

<paper-checkbox id="box" on-change="{{changeHandler}}"></paper-checkbox>

然后在你的脚本中

var box = document.querySelector("#box");
box.checked = true;