javascript - 主干验证自定义函数的主干模型范围问题

标签 javascript backbone.js

我的 Backbone 模型存在范围问题。我试图引用 Backbone.Validation 对象内的模型函数。

即,我无法从 validation 对象/映射中访问模型函数 validateDob:

Backbone.Model.extend({

    validation: {
        firstname: { required: true, msg: _('First Name is required').translate() }
    ,   dobday: this.validateDob    // this. refers to the immediate object {}
    ,   dobmonth: validateDob       // undefined function
    ,   dobyear: this.validateDob   // How can I access the function validateDob?
    }

,   validateDob: function(value)  {
        var selDay = $('select[name="dobday"] option:selected').val();
        var selMonth = $('select[name="dobmonth"] option:selected').val();
        var selYear = $('select[name="dobyear"] option:selected').val();

        if (!Utils.isAdult(selDay, selMonth, selYear))
            return _('You have to be at least 18 years old.').translate();
    }
});

有什么建议我可以如何设置吗?

最佳答案

查看您的代码,validateDob 不需要访问实例,因此您可以将其设为命名函数,如下所示:

function validateDob(value) {
  var selDay = $('select[name="dobday"] option:selected').val();
  var selMonth = $('select[name="dobmonth"] option:selected').val();
  var selYear = $('select[name="dobyear"] option:selected').val();

  if (!Utils.isAdult(selDay, selMonth, selYear))
    return _('You have to be at least 18 years old.').translate();
}

Backbone.Model.extend({
  validation: {
    firstname: {
      required: true,
      msg: _('First Name is required').translate()
    },
    dobday: validateDob,
    dobmonth: validateDob,
    dobyear: validateDob
  },
  validateDob: validateDob
});
<小时/>

但是,不建议使用全局选择器直接从 DOM 访问值。您应该使用范围为 View 元素的选择器将这些值设置为模态属性。

在这种情况下,假设您使用 backbone.validation插件,您可以定义一个返回验证配置的函数,例如:

Backbone.Model.extend({
  validation: function() {
    return {
      firstname: {
        required: true,
        msg: _('First Name is required').translate()
      },
      dobday: this.validateDob, // this should be modal instance now
      dobmonth: this.validateDob,
      dobyear: this.validateDob
    }
  },
  validateDob: function(value) {
    // Now context should be the modal instance so you can do this.get('prop')
    var selDay = $('select[name="dobday"] option:selected').val();
    var selMonth = $('select[name="dobmonth"] option:selected').val();
    var selYear = $('select[name="dobyear"] option:selected').val();

    if (!Utils.isAdult(selDay, selMonth, selYear))
      return _('You have to be at least 18 years old.').translate();
  }
});

关于javascript - 主干验证自定义函数的主干模型范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43315224/

相关文章:

backbone.js - Dart 和第三方库

javascript - 使用 React hooks 实现 shouldComponentUpdate - 仅渲染子组件一次,但在 props 更改时更改 DOM

javascript - 如何对 SVG 中链接的图像进行去饱和处理?

javascript - 下划线模板不在主干中呈现

javascript - : $(this. el).html 和 this.$el.html 有什么区别

javascript - 将 _this 传递给 ajax 调用

javascript - 无论如何如何保持用户登录 Firebase?

javascript - 谷歌地图标记

javascript - Angular 模块延迟实例化

javascript - 点击聆听新创建的模型?