【问题标题】:Meteor binding values for inputs with event generation带有事件生成的输入的流星绑定值
【发布时间】:2020-05-19 01:41:11
【问题描述】:

我有一个表单输入,其值绑定到响应式数据源:

<input type="text" name="first-name" id="first-name" required value="{{currentUser.profile.firstName}}" />

我想在输入端观看“更改”事件:

$('#first-name').change(function() { alert('Value changed!'); });

如果我直接在输入中更改值,这会很好。但是,如果值响应式更改,则不会触发更改事件。

将值绑定到表单元素以便在响应式数据源更改时触发“更改”事件的最佳方法是什么?

【问题讨论】:

  • 您可能会通过自动运行检查反应源来破解它,如果它手动更改会触发输入的机会
  • 同意马克的评论。查看 Tracker.autorun docs.meteor.com/#/full/tracker_autorun

标签: javascript forms meteor data-binding dom-events


【解决方案1】:

最佳解决方案是使用manuel:viewmodel。您将 UI 的状态保存在 javascript 对象中,并将 UI 元素绑定到该对象的属性。

例子:

首先将包添加到项目中meteor add manuel:viewmodel

然后在 Html 中执行以下操作:

<template name="loginBox">
  First Name: <input type="text" data-bind="value: first"/>
  <br/>
  Last Name: <input type="text" data-bind="value: last"/>
  <div data-bind="text: greeting"></div>
  <a data-bind="enabled: canEnter, hover: showError" class="btn-primary">Enter Site</a>
  <span data-bind="text: errorText" class="text-error"></span>
</template>

然后在 Javascript 文件中做必要的绑定

Template.loginBox.viewmodel({
  first: '',
  last: '',
  greeting: function() {
    return "Hello " + this.first() + " " + this.last();
  },
  canEnter: function() {
    return !!this.first() && !!this.last();
  },
  showError: false,
  errorText: function() {
    if (this.canEnter() || !this.showError()) {
      return '';
    }
    return "Please enter your first and last name";
  }
});

这里我们将输入/文本元素的值绑定到视图模型的属性“first”。

结果是视图模型对象将与输入框保持同步。如果你改变了 texbox 中的值,那么 viewmodel 的 'first' 属性的值也会改变,反之亦然。

欲了解更多信息http://viewmodel.meteor.com/

【讨论】:

  • 谢谢,我试试看。很遗憾,没有比 Blaze 更原生的方式来做到这一点!我想知道是否有一种解决方案允许从模板 js 代码设置绑定,而不是通过在标记中放置“数据绑定”属性...
【解决方案2】:

这是我最初的解决方案,我对此并不特别兴奋:

Template.signUpPersonalDetails.rendered = function() {
  this.autorun(function() {
    if (Meteor.user() && Meteor.user().userAccount) {
      var userAccount = Meteor.user().userAccount;
      $('#first-name').val(userAccount.firstName).change();
      $('#last-name').val(userAccount.lastName).change();
      $('#email').val(userAccount.email).change();
      $('#phone-number').val(userAccount.phoneNumber).change();
      $('#postcode').val(userAccount.shippingPostcode).change();
    }
  });
};

【讨论】:

  • 实际上是为了类似的东西。我只是使用一个简单的循环来检查字段,然后如果满足条件,我就在一个字段上触发“更改”。在我的用例中工作。
猜你喜欢
  • 2014-02-14
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 2015-08-09
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
相关资源
最近更新 更多