Hay una manera de ignorar a los suscriptores de un cambio de valor del observable. Me gustaría cambiar un valor de un observable, pero no ejecutarlo para los suscriptores con knockout.js

  • Como RP señala, esto no es generalmente una buena idea. ¿Cuál es su caso? Acaso hay un suscriptor concreto no desea notificar?
  • supongo que en ese caso, usted necesita para cambiar su lógica, por nocaut dosis no se entiende al trabajo como este.
InformationsquelleAutor Mike Flynn | 2013-08-01

4 Comentarios

  1. 82

    Normalmente esto no es posible o aconsejable, ya que potencialmente permite que las cosas para salir de la sincronización en la dependencia de las cadenas. Utilizando el acelerador extensor es generalmente una buena manera de limitar la cantidad de notificaciones que las dependencias están recibiendo.

    Sin embargo, si usted realmente quiere hacer esto, entonces sería una opción para sobrescribir el notifySubscribers función en un observable y tener que comprobar una bandera.

    Aquí es una de las extensiones que añade esta funcionalidad a un observable:

    ko.observable.fn.withPausing = function() {
        this.notifySubscribers = function() {
           if (!this.pauseNotifications) {
              ko.subscribable.fn.notifySubscribers.apply(this, arguments);
           }
        };
    
        this.sneakyUpdate = function(newValue) {
            this.pauseNotifications = true;
            this(newValue);
            this.pauseNotifications = false;
        };
    
        return this;
    };

    Habría que agregar esto a una observables como:

    this.name = ko.observable("Bob").withPausing();

    A continuación, habría que actualizarlo sin notificaciones haciendo:

    this.name.sneakyUpdate("Ted");
    • +1 para el límite. Yo quería evitar ejecutar varias veces un calculada cuando la configuración de múltiples variables observables en el que la calculada dependía. Resultado: La Velocidad++
    • En este caso es el más adecuado, sólo para hacer una pausa de notificaciones para que puedas actualizar todas sus características observables y tener suscripciones activa sólo en el extremo (ryan post knockmeout.net/2011/04/pausing-notifications-in-knockoutjs.html)
    • Bonita respuesta. Creo que ‘sneakyUpdate’ podría ser mejor llamado ‘poke’, desde KO ofrece un built-in ‘peek’ método, que hace bastante lee. ‘poke’ sería la escritura de la versión de ‘vistazo’.
    • Hay un caso de uso, estoy tirando desplegable de opciones de ajax y configuración desplegable valor 3 como seleccionada de forma predeterminada y la primera de ellas, y cuando el usuario cambia el valor de la opción quiero algo de lógica , de cómo hacer eso.
  2. 14

    Un enfoque incluso más sencillo:

    ko.observable.fn.silentUpdate = function(value) {
        this.notifySubscribers = function() {};
        this(value);
        this.notifySubscribers = function() {
            ko.subscribable.fn.notifySubscribers.apply(this, arguments);
        };
    };

    Utilizarlo como sigue:

    this.status = ko.observable("Happily Married");
    this.walkIntoBar();
    this.status.silentUpdate("Single");
    this.walkOutOfBar(); //careful with exceptions
    this.status.silentUpdate("Happily Married");

    Ser utilizados con precaución. Estamos tratando con un objeto observado así, las cosas malas pueden suceder si no notificar a sus suscriptores.

  3. 7

    Me gusta la solución proporcionada por @RP Niemeyer cuando todos los suscriptores deben ser ignorados. Sin embargo, en mi caso, tengo un observable con 2-way enlaces en un control Select. Cuando se utiliza @RP Niemeyer, el control Select no se actualiza. Así que, realmente necesitaba una manera de desactivar específicas de los observadores, no todos. Aquí es una solución generalizada para este caso.

    Agregar extensiones de métodos para ‘tranquilo’ suscribirse y «tranquila», escribe.

    ko.observable.fn.ignorePokeSubscribe = function (callback, thisValue, event){
        var self = this;
        this.subscribe(function(newValue) {
            if (!self.paused)
                callback(newValue);
        }, thisValue, event);
        return this;
    };
    ko.observable.fn.poke = function (newValue) {
        this.paused = true;
        var result = this(newValue);
        this.paused = undefined;
        return result;
    };

    Se suscribiera a observables como:

    this.name = ko.observable("Bob");
    this.name.ignorePokeSubscribe(function(newValue) { /* handler */ }));

    A continuación, habría que actualizarlo sin necesidad de notificaciones haciendo:

    this.name.poke("Ted");   //standard subscribers still get notified
    • No creo que eso significa exactamente lo que usted piensa que significa.
    • Gracias @Barry Franklin, me fijo que la ortografía ‘tranquilo’
    • Gracias, v útil ser capaz de suprimir las notificaciones en los cambios de código, justo lo que necesitaba 🙂
    • Una cosa a tener en cuenta, sospecho que esto no funcionará si el observable tiene un límite de tasa como la devolución de llamada de fuego después de la pausa está desactivada. También, sería bueno si los suscribirse devuelto la suscripción de modo que puede disponer de ella (como el estándar método subscribe)
    • RP Niemeyer respuesta es buena, pero esta es exactamente mi caso de uso: quiero que la interfaz de usuario de actualización todavía, pero el bloqueo de una red específica de canal debido a toda una serie de cambios fueron a granel comunicada por la eficiencia.
    • Gran solución – sin Embargo, creo que quiere volver a ‘esto.suscribirse(…)’ en ignorePokeSubscribe, como ‘esto’ no será similar .suscribirse()

  4. 1

    Me vino a esta pregunta porque yo era la construcción de un bloque paginado de datagrid. Sólo 10 filas se muestra y cada fila tiene una casilla de verificación. El encabezado de la tabla había una (de)seleccionar todos los checkbox.

    Durante la carga de las pruebas se descubrió que al hacer clic en seleccionar todos los checkbox se tradujo en la actualización de 1000 observables a la vez. Este tomó demasiado tiempo.

    Parecía que KO actualizado el html 1000 veces aunque sólo el 10 observables fueron obligados a HTML.

    Si alguien encuentra esta pregunta por la misma razón, sugiero que se busca en actualizaciones diferidas. Actualizaciones diferidas cola de notificar a los suscriptores, se notifica a los suscriptores después de su ‘hilo’ está hecho. Actualizaciones diferidas es configurable para cada observables o para toda la aplicación.

    http://knockoutjs.com/documentation/deferred-updates.html

Dejar respuesta

Please enter your comment!
Please enter your name here