在淘汰赛javascript中更改文本框值时,计算值未更新

时间:2015-01-08 18:43:17

标签: javascript knockout.js knockout-2.0 knockout-validation

http://jsfiddle.net/Kapil_B/vz3r0bs3/9/

在这个小提琴中,我试图在更改文本框中的费率时更新formattedPrice2值。我能够获得更新的价格,但price1没有获得更新值。

您能告诉我为什么price1值没有更新?这就是为什么formattedPrice2没有得到更新。

<select data-bind="options: $root.newLot, value: dropdownAValue, optionsText: 'type'"></select>
<table align="left">
    <thead>
        <tr align="left">
            <th width="10%">Pair</th>
            <th width="10%">Rate</th>
            <th width="10%">formattedPrice2</th>
        </tr>
    </thead>
    <!-- Todo: Generate table body -->
    <tbody data-bind="foreach:curArray">
        <tr>
            <td data-bind="text:  rate().pair"></td>
           <td> <input data-bind="value: myQuote, valueUpdate:'afterkeydown'" />
            </td>
            <td data-bind="text: formattedPrice2"></td>
        </tr>
    </tbody>
</table>

    // Class to represent a row in the price calculation grid
    function PriceCalculation(rate, myQuote, newPairs, nl, currentlotvalue) {
        var self = this;
        self.rate = ko.observable(rate);
        self.newPairs = newPairs;
        self.nl = ko.observable(nl);
        self.myQuote = ko.observable(myQuote);
        self.currentlotvalue = currentlotvalue;

        self.leverage = self.rate().leverage;



        self.formattedPrice2 = ko.computed(function () {
            var cur = self.rate().pair;
            //var price = self.rate().price;
            var price = self.myQuote();

            var pip = 1;
            var lot1 = self.currentlotvalue;
            var JPlot = lot1 * 100;

            if (cur.indexOf("/USD") > -1) {
                pip = lot1;
            } else if (cur.indexOf("/JPY") > -1) {
                pip = JPlot / price;
            } else if (cur.indexOf("USD/") > -1) {
                pip = lot1 / price;
            } else {



                var base = cur.split("/")[0];
                var counter = cur.split("/")[1];

                for (var i = 0; i < self.newPairs.length; i++) {
                    var base1 = self.newPairs[i].pair.split("/")[0];
                    var counter1 = self.newPairs[i].pair.split("/")[1];

                    var price1 = self.newPairs[i].price;
                    alert(price1);

                    if (base1 == "USD") {
                        if ((self.newPairs[i].pair) == ("USD/" + counter)) {
                            pip = lot1 / price1;
                        }
                    } else if (counter1 == "USD") {
                        if ((self.newPairs[i].pair) == (counter + "/USD")) {
                            pip = lot1 * price1;
                        }
                    }
                }

            }

            //alert(pip? "$" + pip.toFixed(2): "None");
            return pip ? "$" + pip.toFixed(2) : "None";

        });





    }

    // Overall viewmodel for this screen, along with initial state
    function ReservationsViewModel() {
        var self = this;

        self.curArray = ko.observableArray([]);

        self.rates = ko.observableArray([]);

        // Non-editable catalog data - would come from the server
        self.rates = [ {
            pair: "EUR/HUF",
            price: 318.815,
            leverage: "20:1*"
        }, {
            pair: "USD/HUF",
            price: 265.13,
            leverage: "20:1*"
        }, {
            pair: "XAG/USD",
            price: 15.734,
            leverage: "1:1*"
        }, {
            pair: "XAU/USD",
            price: 1184.43,
            leverage: "1:1*"
        }];

        self.newLot = [{
            type: "Micro",
            lotSize: 0.1
        }, {
            type: "Mini",
            lotSize: 1
        }, {
            type: "Standard",
            lotSize: 10
        }];

        self.newlots = ko.observableArray(self.newLot);

        self.dropdownAValue = ko.observable(self.newlots);

        var currentlotvalue = 0.1;
        self.dropdownAValue.subscribe(function () {
            if (self.dropdownAValue().type == "Micro") {
                //alert("Micro");
                currentlotvalue = 0.1;
            } else if (self.dropdownAValue().type == "Mini") {
                //alert("Mini");
                currentlotvalue = 1;
            } else if (self.dropdownAValue().type == "Standard") {
                //alert("Standard");
                currentlotvalue = 10;
            }

            var newItems = ko.utils.arrayMap(self.rates, function (item) {

                return new PriceCalculation(item, item.price, self.rates, self.newLot[0], currentlotvalue)
            });
            self.curArray(newItems);
        },this, "change");
    }
    ko.applyBindings(new ReservationsViewModel());

0 个答案:

没有答案