如何使表单控件以“回写”方式进行响应?

时间:2013-06-06 18:58:53

标签: javascript meteor

假设我有两个文本输入字段,其值与集合的名称和描述相关联:

{{#with set}}
<input type="text" id="set_name" value="{{name}}" placeholder="Untitled Set"/>
<input type="text" id="set_desc" value="{{description}}" placeholder="Add Description"/>
{{/with}}

目前,当用户更改输入字段时,我必须添加代码以手动更新Set的属性,例如(在CoffeeScript中)

update = (set, field, newVal)->
  newVal = $.trim(newVal)
  if newVal && set[field] != newVal
    keyVal = {}
    keyVal[field] = newVal
    Sets.update(_id:set._id, {$set:keyVal})

Template.cardSubmit.events
  'change #set_name': (evt)->
    update(this, 'name', evt.target.value)
  'change #set_desc': (evt)->
    update(this, 'description', evt.target.value)

一段时间后,这会非常重复。在Meteor中有没有办法以声明方式进行此操作?如果没有,任何建议如何扩展Meteor以允许这种双向反应?

Knockout.js有一个巧妙的方法(当然只是在客户端):http://knockoutjs.com/documentation/value-binding.html

1 个答案:

答案 0 :(得分:0)

您正在寻找的是双向数据绑定。正如@emgee所说,Meteor(尚未)本身支持它。也就是说,您可以使用以这种或那种方式添加它的软件包来扩展Meteor:

  • Handlebar-bind专门用于为Handlebars模板添加双向数据绑定支持。请参阅有关liveUpdate:true的说明。请注意,该软件包将其描述为“早期潜行测试状态”。
  • Angular.js for Meteor将Angular框架添加到Meteor中。这是一个更激进的解决方案,它或多或少会用支持双向数据绑定的Angular.js模板替换Handlebars。虽然Angular本身已经成熟,但它在Meteor中的实现在这一点上同样是alpha。