He construido una muy data/número pesados de la aplicación en octavos de final. Actualmente estoy recibiendo este error:

De dicho Error: No se puede escribir un valor en un ko.calculada a menos que
especificar una ‘escritura’ opción. Si desea leer el valor actual, no
pasar parámetros.

Esto está sucediendo cuando mi costumbre bindingHandler (que los formatos de los números dentro de los ‘grandes’ del formulario, es decir,. 123,345,678,987) intenta volver a escribir la entrada original que muestra el valor de una exploración de la función.

Valor que se muestra en un elemento de entrada:

self.value = ko.computed(function(){
    return self.chosenAge().population; //'fetched' from an array.
});

Unión De Controlador:

ko.bindingHandlers.largeNumber = {
    init: function(element, valueAccessor) {
        numberInit(element);
        var value = valueAccessor();
        var interceptor = ko.computed({
            read: function() {
                //inject number formatting
                return numeral(ko.unwrap(value)).format('0,0');
            },
            write: function(newValue) {
                //remove formatting when writing a new value
                value(numeral().unformat(newValue));
            }
        });
        //display new value in target element
        if(element.tagName.toLowerCase() == 'input' ) {
            ko.applyBindingsToNode(element, {
                value: interceptor
            });
        }
        else {
            ko.applyBindingsToNode(element, {
                text: interceptor
            }); 
        }
    }
};
  • De verdad que quieres volver a escribir su value calculada? O quieres actualizar la population?
  • Básicamente, como puedes decir que el valor que se muestra en el campo de entrada se obtiene de la chosenAge matriz. Estoy tratando de conseguir así que si haces clic en ese elemento de entrada puede introducir su propio personalizado de la población CON la largeNumber formato
InformationsquelleAutor leaksterrr | 2014-06-05

2 Comentarios

  1. 1

    Necesita especificar una ‘escritura’ opción en su ko.calcula la función. Por favor, consulte la documentación calculadas observables. Su unión controlador no tiene nada que ver con su valor de no actualizar. Su calculada debe ser algo como esto:

    self.value = ko.computed(function(){
        read: function () {
            return self.chosenAge().population; //'fetched' from an array.
        },
        write: function (value) {
            //update your self.chosenAge().population value here
        },
        owner: self
    });

    Espero que esto ayude.

    • Sí he probado este originalmente, el problema que estoy teniendo es con escribir de nuevo? No está seguro de cómo ir sobre él
    • Sin más información acerca de su chosenAge objeto realmente no puedo dar una buena respuesta, podrías actualizar el post con más información sobre ella?
    • Creo que el código es incorrecto, dentro de ko.computed debe ser un objeto, no una función. También el enlace es obsoleta, el nuevo enlace es knockoutjs.com/documentation/computed-writable.html
    • esto no es correcto javascript
  2. 0

    Personalmente, creo que sería la captura de la ejecución de su formato en una extender.

    Definir una extensión que ajusta los datos observables con un computed formateador:

    ko.extenders.largeNumber = function (target, option) {
    
      var formatter = ko.computed( {
        read: function(){
        var formatted = target().toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
        return formatted;
      },
        write: function(nv){
            var numeric = nv.replace(/,/g,""); 
            target(numeric);
    
            console.log("View model now contains " + target())
      }
     })
     return formatter;
    };

    A continuación, crear un observable que utiliza la extensión: (he envuelto en un constructor)

    function createExtendedObs(initialValue){
        return ko.observable(initialValue).extend({
        largeNumber: {
            viewModel: self
        }
     });

    Además, me gustaría hacer mi observable ser el population de la propiedad en el objeto de datos que representa una chosenAge

    {
      name: "Bronze",
      population: createExtendedObs(10000)
    }

    Este no es un requisito. Si desea que la población a ser almacenados en otro observable, tengo que instalar el extensor de tener acceso a la viewModel a través de la options parámetro. Por lo tanto, usted podrá acceder a los otros observables de esa manera. Si el «otro» observables iban a ser un calculada, entonces usted tendrá que especificar el write función (como se representa en la otra respuesta), que es la raíz del problema que están teniendo. Otra opción sería la de subscribe a chosenAge y establecer el «otro» de la población observable desde dentro de la suscripción.

    El uso de la propiedad de datos directamente, yo soy capaz de unirse a él de la siguiente manera,

    <div data-bind='with: chosenAge'>  
      <input data-bind='value: population'></input>
    </div>

    Retirar mi violín para la instalación completa.


    Editar

    Sólo revisó un comentario sobre el deseo de introducir el valor «con» el formato. El campo será un formato cada vez que la calculada recibe un nuevo valor. Por defecto, este será el enfoque de la pérdida. Si desea modificar la entrada está prevista a continuación, usted tendría que proporcionar la valueUpdate unión parámetro. Desde el campo está siendo manipulado de forma dinámica, esto causará símbolo de intercalación de posicionamiento problemas. Usted necesita para administrar la posición del cursor en consecuencia.

    <input data-bind='value: population, valueUpdate: "afterkeydown"'></input>

Dejar respuesta

Please enter your comment!
Please enter your name here