【问题标题】:Aurelia two-way binding in custom element not working自定义元素中的 Aurelia 双向绑定不起作用
【发布时间】:2016-08-21 12:11:41
【问题描述】:

尝试学习 Aurelia 1.0,但我似乎无法在自定义元素上进行双向绑定。

使用 bootstrap-datepicker 我制作了一个日期范围选择器自定义元素:

日期范围选择器.js

import {bindable, bindingMode, inject} from 'aurelia-framework';
import $ from 'jquery';
import datepicker from 'bootstrap-datepicker';

@inject(Element)
export class DateRangePicker {
  @bindable startName = 'start';
  @bindable endName = 'end';
  @bindable startValue = null;
  @bindable endValue = null;

  constructor(element) {
    this.element = element;
  }

  attached() {
    $(this.element).find('.input-daterange').datepicker();
  }
}

日期范围选择器.html

<template>
  <div class="input-daterange input-group" id="datepicker">
    <input type="text" class="input-sm form-control" 
      name="${startName}" id="${startName}" 
      value.two-way="startValue" 
      placeholder="Start Date (mm/dd/yyy)" />
    <span class="input-group-addon">to</span>
    <input type="text" class="input-sm form-control" 
      name="${endName}" id="${endName}" 
      value.two-way="endValue" 
      placeholder="End Date (mm/dd/yyy)"/>
  </div>
</template>

在leads.html中使用了自定义元素:

<div class="col-sm-12">
  <form role="form" class="form-inline" submit.delegate="search()">
    <div class="form-group">
      <date-range-picker 
        start-name="createdAtStartDate" start-value.two-way="startDate" 
        end-name="createdAtEndDate" end-value.two-way="endDate">  
      </date-range-picker>
    </div>
    <button type="submit" class="btn btn-primary">Search</button>
  </form>
</div>

leads.js

import {inject} from 'aurelia-framework';
import {LeadsService} from './leads-service';
import moment from 'moment';

@inject(LeadsService)
export class Leads {
  startDate = moment().format('M/D/YYYY');
  endDate = moment().format('M/D/YYYY');
  leads = [];

  constructor(dataService) {
    this.dataService = dataService;
  }

  search() {
    this.dataService.getLeads({
      startDate: this.startDate,
      endDate: this.endDate
    })
   .then(leads => this.leads = leads);
  }
}

date-range-picker 按预期工作,leads.js 中 startDate 和 endDate 设置的任何值都正确绑定到自定义元素中的输入框,但是当我提交表单时 startDate 和 endDate 甚至没有改变如果我更改输入框的值。

任何想法我做错了什么?

【问题讨论】:

    标签: javascript bootstrap-datepicker aurelia


    【解决方案1】:

    这些值正在由 javascript 更新,因此您必须调度输入的更改事件,如下所示:

     attached() {
        $(this.element).find('.input-daterange').datepicker()
          .on('changeDate', e => {
            e.target.dispatchEvent(new Event('change'));
          });
      }
    

    这是一个运行示例https://gist.run/?id=5d047c561cf5973cf98e88bae12f4b4e

    【讨论】:

    • 我实际上首先尝试过,但我仍然得到相同的结果。我更改了 startValue 和 endValue 以指定你所说的 defaultBindingMode 但仍然不起作用。我尝试不使用自定义元素,只使用输入文本框和双向绑定。似乎它不适用于自定义元素。
    • 我不确定它是否会有所不同,但请尝试从可绑定声明中删除“= null”。 @bindable({ defaultBindingMode: bindingMode.twoWay }) startValue; // no = null here
    • 不幸的是,即使在删除“= null”之后,双向绑定仍然不起作用。 @bindable({ defaultBindingMode: bindingMode.twoWay }) startValue;
    • 哦,我知道为什么,该值正在由 javascript 更新。你必须听一些“改变”的方法,然后调用 this.element.dispatchEvent。有时间我会写一个例子
    • 它适用于法比奥!谢谢!好的,所以只是为了了解发生了什么,bootstrap-picker javascript 是更新输入框的一个,这些输入框从潜在客户视图模型中绑定到 startValue。但是既然是javascript代码,就没有触发双向绑定的change事件?
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2017-07-15
    • 2015-08-07
    • 2016-10-06
    • 1970-01-01
    相关资源
    最近更新 更多