Pregunta

Estoy usando jQuery con el complemento de validadores.Me gustaría reemplazar el validador "obligatorio" por uno propio.Esto es facil:

jQuery.validator.addMethod("required", function(value, element, param) {
    return myRequired(value, element, param);
}, jQuery.validator.messages.required);

Hasta ahora, todo bien.Esto funciona bien.Pero lo que yo en realidad Lo que quiero hacer es llamar a mi función en algunos casos y al validador predeterminado para el resto.Desafortunadamente, esto resulta ser recursivo:

jQuery.validator.addMethod("required", function(value, element, param) {
    // handle comboboxes with empty guids
    if (someTest(element)) {
        return myRequired(value, element, param);
    }
    return jQuery.validator.methods.required(value, element, param);
}, jQuery.validator.messages.required);

Miré el código fuente de los validadores y la implementación predeterminada de "requerido" se define como un método anónimo en jQuery.validator.messages.required.Entonces no hay ninguna otra referencia (no anónima) a la función que pueda usar.

Almacenar una referencia a la función externamente antes de llamar a addMethod y llamar al validador predeterminado a través de esa referencia no hace ninguna diferencia.

Lo que realmente necesito hacer es poder copiar la función de validación requerida predeterminada por valor en lugar de por referencia.Pero después de buscar un poco, no sé cómo hacerlo.¿Es posible?

Si es imposible, puedo copiar la fuente de la función original.Pero eso crea un problema de mantenimiento y preferiría no hacerlo a menos que no haya una "mejor manera".

¿Fue útil?

Solución

  

Almacenar una referencia a la función   externamente antes de llamar a addMethod   y llamando al validador predeterminado a través de   esa referencia no hace ninguna diferencia.

Eso es exactamente lo que debería funcionar .

jQuery.validator.methods.oldRequired = jQuery.validator.methods.required;

jQuery.validator.addMethod("required", function(value, element, param) {
    // handle comboboxes with empty guids
    if (someTest(element)) {
        return myRequired(value, element, param);
    }
    return jQuery.validator.methods.oldRequired(value, element, param);
}, jQuery.validator.messages.required);

Esto también debería funcionar: (Y el problema con this está resuelto)

var oldRequired = jQuery.validator.methods.required;
jQuery.validator.addMethod("required", function(value, element, param) {
    // handle comboboxes with empty guids
    if (someTest(element)) {
        return myRequired(value, element, param);
    }
    return oldRequired.call(this, value, element, param);
    // return jQuery.oldRequired.apply(this, arguments);
}, jQuery.validator.messages.required);

Otros consejos

Function.prototype.clone = function() {
    var fct = this;
    var clone = function() {
        return fct.apply(this, arguments);
    };
    clone.prototype = fct.prototype;
    for (property in fct) {
        if (fct.hasOwnProperty(property) && property !== 'prototype') {
            clone[property] = fct[property];
        }
    }
    return clone;
};

Lo único malo de eso es que el prototipo no está clonado, por lo que realmente no puede cambiarlo ... Estoy trabajando en una forma de clonar cualquier tipo de objeto y solo me queda RegExp. Así que probablemente edite mañana y coloque todo el código (que es bastante largo y no está optimizado si solo lo usa para funciones y objetos.

Y para comentar otras respuestas, usar eval () es totalmente estúpido y es demasiado largo y el constructor de funciones es más o menos lo mismo. Las litros son mucho mejores. E incluir JQuery solo por eso, además, si no funciona correctamente (y no creo que lo haga) no es lo más brillante que puede hacer.

Aquí hay una respuesta actualizada

var newFunc = oldFunc.bind({}); //clones the function with '{}' acting as it's new 'this' parameter

Sin embargo .bind es una nueva característica de JavaScript, sin embargo, existe una solución alternativa de Mdn

https://developer.mozilla.org/en/JavaScript/ Referencia / Global_Objects / Function / bind

Además, no clona las propiedades adicionales de la función.

Nota: Como señaló @gsnedder: la declaración enlazada, " this " argumento proporcionado (en blanco {} arriba). Persistirá para cualquier llamada futura de la función, independientemente de la anulación a través de las funciones apply () / call ().

Esto puede usarse tanto para su ventaja como para su desventaja dependiendo de cómo lo maneje.

Creo que solo te falta un poco de alcance. Prueba esto:

jQuery.validator.methods._required = jQuery.validator.methods.required;
jQuery.validator.addMethod("required", function(value, element, param) {
    // handle comboboxes with empty guids
    if (someTest(element)) {
        return myRequired(value, element, param);
    }
    return jQuery.validator.methods._required.call(this, value, element, param);
}, jQuery.validator.messages.required);

(esto sólo debería ser un comentario para ¿Puedo copiar/clonar una función en JavaScript? ...desafortunadamente con rep < 50 solo puedo publicar)

Function.prototype.clone=function(){
    return eval( '('+this.toString()+')' );
}

suficiente, o incluso

Object.prototype.clone=function(){
    return eval( '('+this.toString()+')' );
}

reflexiones sobre la eficiencia:

  • La eficiencia humana es mucho más importante que el despilfarro humano Recursos para optimizar o mejorar la "vida" de una máquina
  • Se supone que las computadoras y los sistemas automatizados reducen el esfuerzo humano no aumentarlo
  • La sobrecarga computacional debe afectar gravemente a la palatabilidad de un resultado para el consumo humano, por muchísimas personas, para justificar la inversión esfuerzo en la optimización del código que a menudo se vuelve más oscuro, arcano y tan esotérico que ya no puede ser entendido por un grupo estable de programadores después de horas de tratar de "comprender" la lógica

sobre clonación:esta pregunta puede ser bastante retórica

  • ¿Qué significa "clonar" un objeto javascript?especialmente en el contexto de la teoría de funciones recursivas
    • Un tema común para racionalizar la clonación es que aísla y "protege" al creador de sus cambios doppelgänger.
    • si a = new Object(); b = new Object(); son a y b clones?qué tal si o = Object; a = new o(); b = new o();
  • ¿Es realmente necesario?
  • ¿Dónde termina la clonación?son los atributos prototípicos que deben ser aislado también para que el cambio de un objeto clonado de estos no afecte instancias no asociadas con el objeto clonado?en cuyo caso La clonación debe ir hasta la cadena prototípica hasta el constructores primitivos que a su vez tendrían que ser de alguna manera clonado y aislado (un truco en un navegador es abrir una nueva ventana y volver a llenarla con la advertencia de que opener . etc.todavía puede filtrar efectos cruzados)

si desea clonar una función, intente esto:

Function.prototype.clone=function(){
    return eval('['+this.toString()+']')[0];
}

Parece que no hay una "mejor manera". Supongo que podría intentar hacer una función requerida personalizada para su propio ejemplo, por ejemplo:

jQuery.validator.addMethod("customRequired", function(value, element, param) {
  return myRequired(value, element, param);
}, jQuery.validator.messages.required);

Parece que ya has probado todo lo demás. Disculpas si entendí mal la pregunta.

Respondiendo a la publicación anterior, cuando necesito compartir una función de constructor, mientras mantengo un prototipo distinto, utilizo un contenedor en una nueva Función:

`

init_from_arg_obj = function () {
    return new Function('init', 'for (var i in init) this[i] = init[i];');
};

constructor_A = init_from_arg_obj();
constructor_A.prototype = {a: 'A'};

constructor_B = init_from_arg_obj();
constructor_B.prototype = {b: 'B'};

`

Ejecuté varias pruebas para verificar que esto no ralentiza la ejecución en buenos motores JS.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top