未使用RactiveJS触发选择事件

时间:2014-04-11 15:32:41

标签: javascript ractivejs

我做错了吗?

我的模板

   <select id="muni" class="form-control" value="{{formData.muni_ssn}}" on-select="muni_selected">
       {{#formData.municipalities}}
       <option value="{{ssn}}">{{name}}</option>
       {{/formData.municipalities}}
   </select>

我的js代码

var caseForm = new Ractive({
    el: "case-form",
    template: "#CaseFormTemplate",
    data: {
        formData: mappeal.caseFormData
    }
});

caseForm.on("muni_selected", function (event) {
   alert(event.context.formData.muni_ssn);
});

1 个答案:

答案 0 :(得分:11)

没有select事件这样的事情。在标准JavaScript中,如果没有Ractive,您可以执行此操作来收听<select>元素值的更改:

// 'change' event, not 'select' event
document.getElementById( 'muni' ).addEventListener( 'change', function () {
  console.log( 'select value changed to', this.value );
});

因此Ractive中的等价物将是

<select id="muni" class="form-control" value="{{formData.muni_ssn}}" on-change="muni_selected">
  {{#formData.municipalities}}
    <option value="{{ssn}}">{{name}}</option>
  {{/formData.municipalities}}
</select>

但实际上,使用Ractive监听这些更改的方法实际上更为简单 - 观察数据本身。首先,我们可以摆脱事件处理程序指令:

<select id="muni" class="form-control" value="{{formData.muni_ssn}}">
  {{#formData.municipalities}}
    <option value="{{ssn}}">{{name}}</option>
  {{/formData.municipalities}}
</select>

然后,在您的代码中,执行以下操作:

caseForm.observe( 'formData.muni_ssn', function ( newValue, oldValue ) {
  console.log( 'changed from', oldValue, 'to', newValue );
});

这样做的好处是,您不需要区分由于DOM交互而发生的更改,以及以编程方式发生的更改(例如,作为初始设置的一部分) - 使其更容易跟踪申请状态。