2015-10-28 4 views
0

У меня есть раскрывающийся список, который позволяет человеку выбрать вариант ценообразования, один из которых - «Скидка». Если выбрана опция «Скидка», мне нужно, чтобы поле затрат стало отрицательным. Это было легко достичь.Нокаут: изменение значения ввода зависит от значения понижающего значения

Моя проблема: как я могу сделать поле затрат отрицательным после ввода положительного значения, обнаружив, что опция ценообразования выпадает на «Скидка». Ниже приведен упрощенный вариант моей модели и то, что у меня есть для логики, чтобы превратить число в отрицательное, если сбрасывается.

var row = function (pricing, c) { 
var self = this; 
self.cost = ko.observable(c ? c : "0").extend({ required: true }); 
self.pricingOptions = ko.observableArray([ 
    { id: "1", value: "Freight" }, 
    { id: "2", value: "Discount" } 
]); 
self.selectedPricing = ko.observable(pricing ? pricing : ""); 
self.selectedPricing.subscribe(function (value) { 
    if (value == "Discount") 
    { 
    if (parseFloat(self.cost()) > 0) { 
    self.cost(-parseFloat(self.cost())); 
    } 
    } else { 
    if (parseFloat(self.cost()) < 0) { 
    self.cost(-parseFloat(self.cost())); 
    } 
    } 
}); 
} 

EDIT: вот jsfiddle, что у меня есть: http://jsfiddle.net/tt1mtb19/3/

обратите внимание, что если уже выбран Discount, когда вы вводите в количестве в поле, он остается положительным, независимо от того, что. Он изменяется только на отрицательный, если вы измените его вниз на Фрахт, а затем на Скидку.

+0

вы можете использовать что-то вроде 'self.discount = ko.computed (функция() {возвращение self.cost() * - 1}) ' – stackoverfloweth

+0

умножить его на -1 – dan

+0

@dan Я уже делаю это, что это не то, что мой вопрос был. – luthan

ответ

1

Все, что вам нужно сделать, это умножить на максимальное отрицательное целое число i.e -1 и самое главное использовать событие blur.

ViewModel:

var ViewModel = function (pricing, c) { 
    var self = this; 
    self.cost = ko.observable(c ? c : 0); 
    self.selectedPricing = ko.observable(pricing ? pricing : ""); 
    self.pricingOptions = ko.observableArray([{ 
     id: "1", 
     value: "Freight" 
    }, { 
     id: "2", 
     value: "Discount" 
    }]); 
    self.selectedPricing.subscribe(function (value) { 
     switch (value) { 
      case "1": 
       self.cost(parseFloat(self.cost())); 
       break; 
      case "2": 
       self.cost(-1 * parseFloat(self.cost())); 
       break; 
      default: 
       break; 
     } 
    }); 
    self.modify = function() { 
     if (self.selectedPricing() == 2 && self.cost() > 0) { 
      self.cost(-1 * parseFloat(self.cost())); 
     } 
    } 
} 

ko.applyBindings(new ViewModel(0, 2)); 

образец работает скрипку here

+0

Я уже знаю, как изменить значение текстового поля на отрицательный после выбора «Скидка». У меня проблема в том, как изменить значение текстового поля после простого ввода положительного значения ПОСЛЕ того, как ранее была выбрана «Скидка». В вашем примере установите для раскрывающегося списка значение «Скидка», затем введите 1 в поле. После того, как вы удалите фокус с поля, он останется на 1. Мне нужно, чтобы он изменился на -1 автоматически, если «Скидка» уже выбрана. – luthan

+1

уверен. все, что вам нужно, это событие «размытия», которое делает вашу работу условно проверять обновление @luthan –

+0

ах да! я не думал использовать размытие. как-то я ожидал добиться этого через продюсеров, но это только усложняло бы все. огромное спасибо. – luthan

Смежные вопросы