Est-ce que je manque quelque chose? J'ai d'autres prototypes dans ce même fichier et ils fonctionnent comme prévu.

module StACS    
    export module NumberPrototypes {
        export function initializer() {
            // OTHER PROTOTYPES REMOVED FOR SPACE

            Number.prototype.toPureNumber = function(): number {
                var self = this;
                return parseFloat(self.toString().replace(/[^\d.-]/g, ''));
            }
        }
    }
}

interface Number {
    toMoney(decimals?: number, decimalCharacter?: string, thousandsCharacter?: string): string;
    toPercentage(decimals?: number, showSymbol?: boolean): string;
    toPureNumber(): number; 
}

Mon observable:

productPrice: KnockoutObservable<number>:
productsTabView.productModel().productPrice()

Résultat:

"$25.00"

Quand j'essaye de faire ça:

productsTabView.productModel().productPrice().toPureNumber()

J'obtiens l'erreur suivante:

Uncaught TypeError: productsTabView.productModel(...).productPrice(...).toPureNumber is not a function
    at <anonymous>:2:47
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluate (<anonymous>:694:21)
0
Jason H 15 juil. 2015 à 00:00

2 réponses

Meilleure réponse

OK, j'ai enfin compris mon problème. Malheureusement, ce n'est pas quelque chose que quiconque ici aurait probablement compris car il vous manquait un élément clé. Même si l'observable KO est défini sur un nombre, un prolongateur personnalisé y est attaché. Cet extender effectue le formatage et renvoie une chaîne, pas un nombre.

C'est pourquoi je comprends ceci:

productsTabView.productModel().productPrice()
"$0.00"

J'ai changé le prototype en ceci:

String.prototype.toPureNumber = function (): number {
    var self = this;
    return parseFloat(self.toString().replace(/[^\d.-]/g, ''));
}

Et maintenant, cela fonctionne comme prévu:

productsTabView.productModel().productPrice().toPureNumber()
0
0
Jason H 15 juil. 2015 à 03:40

Les oeuvres suivantes:

interface Number {
    toPureNumber(): number; 
}

Number.prototype.toPureNumber = function(): number {
    var self = this;
    return parseFloat(self.toString().replace(/[^\d.-]/g, ''));
}

var foo = 123.3;
var bar = foo.toPureNumber();
console.log(bar);

RÉPARER

Appelez initializer.

-1
basarat 15 juil. 2015 à 01:38