2013-12-04 4 views
6

У меня возникла ситуация, когда мне нужно проверить максимальную величину поля в моей модели просмотра. Однако максимальная сумма должна быть переменной и рассчитываться в зависимости от элемента пользовательского интерфейса, выбранного вне этой модели. Я попытался включить наблюдаемый в качестве параметра в свой пользовательский валидатор, но он не обновляется при изменении значения.Нокаут Пользовательская проверка с наблюдаемым параметром

У меня такое чувство, что после того, как код проверки выполняется в первый раз, он держится за параметры.

HTML, из списка, который не использует Нокаут

<select id="ContentsReplacementAmount"> 
    <option value="25000">£25000</option> 
    <option value="50000">£50000</option> 
    <option value="75000">£75000</option> 
</select> 

Вот это dummed вниз версия кода, я использую.

var SpecifiedValuablesViewModel = function (maxSpecifiedItemAmount) { 
    var self = this; 

    self.maxSpecifiedItemAmount = ko.observable(maxSpecifiedItemAmount); 

    self.amountToAdd = ko.observable().extend({ 
     validation: { 
      validator: function (val, max) { 
       return val <= max; 
      }, 
      message: 'The amount must be a maximum of £{0}', 
      params: self.maxSpecifiedItemAmount() 
     } 
    }); 
}; 

var specifiedValuablesViewModel = new SpecifiedValuablesViewModel($('#ContentsReplacementAmount').val()); 
ko.applyBindings(ko.validatedObservable(specifiedValuablesViewModel), document.getElementById('SpecifiedValuables')); 

событий за пределами из maxSpecifiedAmount

$('#ContentsReplacementAmount').on('change', function() { 
    specifiedValuablesViewModel.maxSpecifiedItemAmount(parseInt($(this).val())); 
}); 

Мой вопрос, как я могу добиться этого?

+0

Обычно я получаю строковое представление числа в $ (asdf) .val(), и часто побочный эффект === или <= имеет тенденцию быть недопустимым ... убедитесь, что ваш 'max' и/или 'val' не являются строкой. – beauXjames

+0

Это тип строки в этом примере, но не в моем приложении. Это просто не изменится. Любые другие идеи? Я обновлю код выше – Stokedout

+0

parseInt (strNumber)? – beauXjames

ответ

6

Теперь я сумел понять это, используя следующий код:

Создать пользовательскую функцию валидатор

var customMax = function(val, max) { 
    return val <= max(); 
}; 

Передайте функцию проверки и обернуть сообщение в функции

var SpecifiedValuablesViewModel = function (maxSpecifiedItemAmount) { 
    var self = this; 

    self.maxSpecifiedItemAmount = ko.observable(maxSpecifiedItemAmount); 

    self.amountToAdd = ko.observable().extend({ 
     validation: { 
      validator: customMax, 
      message: function() { return 'The maximum allowed is ' + self.maxSpecifiedItemAmount(); }, 
      params: self.maxSpecifiedItemAmount 
     } 
    }); 

    self.maxSpecifiedItemAmount.subscribe(function (amount) { 
     self.amountToAdd.isModified(false); 
    }); 
}; 

var specifiedValuablesViewModel = new SpecifiedValuablesViewModel($('#ContentsReplacementAmount').val()); 
ko.applyBindings(ko.validatedObservable(specifiedValuablesViewModel), document.getElementById('SpecifiedValuables')); 

$('#ContentsReplacementAmount').on('change', function() { 
    specifiedValuablesViewModel.maxSpecifiedItemAmount(parseInt($(this).val())); 
}); 

JSFiddle example

1

Это выстрел в темноте, так как я не все, что знаком с плагин проверки, но попробуйте

validation: { 
     validator: function (val, max) { 
      return val <= max(); 
     }, 
     message: 'The amount must be a maximum of £{0}', 
     params: self.maxSpecifiedItemAmount 
    } 

Таким образом, вы передаете наблюдаемые себя, а не его значения, как ваши параметр валидации и его оценку при вызове функции валидатора, а не при определении правила.

+0

Если я это сделаю, некоторые из них очищают значение 'self.maxSpecifiedItemAmount' после его изменения, я думаю, что проверка очистит его – Stokedout

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