返回函数值并进行比较时的正确处理

时间:2014-10-29 23:48:36

标签: jquery function coffeescript jquery-validate

调用直接在比较中返回值的函数是不好的做法吗?

我有这个coffeescript代码在我的开发环境中运行良好,但在服务器上它不起作用。它看起来像这样。

$.validator.addMethod "fullName", (value, element) ->
  num_words = (value) ->
    parts = value.split(" ")
    remove_empty = $.inArray("", parts)
    parts.splice remove_empty if remove_empty isnt -1
    return parts.length
  num_words(value) > 1
, "Please enter your first and last name"

JQuery validate调用此函数num_words并返回条件num_words(value) > 1

的结果

是否会失败,因为我在比较中直接调用该函数而不是先将其赋值给变量?

2 个答案:

答案 0 :(得分:1)

coffeescript中的所有内容都被视为表达式,因此您使用该语言没有任何问题,但我认为您的代码可能会遗漏一些边缘情况。

由于您使用的是coffeescript,您是否会考虑以下蓝图(您可能需要针对您的特定用例略微调整验证):

window.validators ?= {} # just a namespace

class validators.NameValidator
  isValidString = (s)-> /\w+/.test(s)

  constructor: (@names)->
    @validStrings = $.grep(@names, isValidString)

  isValid: -> @validStrings.length > 1

# wrapper for the class
checkNames = (value, element)->
  validator = new validators.NameValidator(value.split(" "))
  validator.isValid()


$.validator.addMethod("fullName", checkNames, "Please enter your first and last name")

基于@ sparky http://jsfiddle.net/53kh1L4s/4/

的工作小提琴

答案 1 :(得分:0)

你的CoffeeScript converted回到普通的JavaScript就是这个......

$.validator.addMethod("fullName", function(value, element) {
    var num_words;
    num_words = function(value) {
        var parts, remove_empty;
        parts = value.split(" ");
        remove_empty = $.inArray("", parts);
        if (remove_empty !== -1) {
            parts.splice(remove_empty);
        }
        return parts.length;
    };
    return num_words(value) > 1;
}, "Please enter your first and last name");

既然我可以更好地阅读它(我不知道CoffeeScript ),我不明白为什么它如此冗长。您不需要num_words方法函数中的fullName函数。尽管冗长,as plain JavaScript, it still works。显然,这是CoffeeScript在您编写时无法处理的情况。

然而,这个版本的工作方式完全相同,但它更短更简洁......

$.validator.addMethod("fullName", function(value, element) {
    var parts = value.split(" "),
    remove_empty = $.inArray("", parts);
    if (remove_empty !== -1) {
        parts.splice(remove_empty);
    }
    return parts.length > 1;
}, "Please enter your first and last name");

工作演示:http://jsfiddle.net/53kh1L4s/

我在这里看不到问题,毕竟,因为它只是从一个地方调用,所以在num_words方法函数中拥有fullname函数绝对没有优势。 / p>


converted back加入CoffeeScript ......

$.validator.addMethod "fullName", ((value, element) ->
    parts = value.split(" ")
    remove_empty = $.inArray("", parts)
    parts.splice remove_empty  if remove_empty isnt -1
    parts.length > 1
), "Please enter your first and last name"

工作演示(CoffeeScript):http://jsfiddle.net/xyxq2c73/