2017-02-15 2 views
1

У меня есть нокаут viewModel и я подключаю JQuery для проверки. Одно из значений, code, я хочу удаленную проверку, чтобы убедиться, что она еще не используется. Проблема в том, что в моем методе для удаленной проверки вызов self.code() возвращает старое значение вместо нового.Нокаут и проверка jQuery Удаленный: не получает последнее значение

Мой Validate код (заметьте, я также попробовал "более прямой" метод получения значения, но безрезультатно - тот же результат):

form.validate({ 
    rules: { 
     'plandetail-code': { 
      required: true, 
      remote: { 
       url: '/Plans/ValidatePlanCode', 
       type: 'POST', 
       data: { 
        id: self.id(), 
        code: self.code() //form.find('[name="plandetail-code"]').val() 
       } 
      } 
     }, 
     'plandetail-name': "required"      
    } 
}); 

Соответствующие Html:

<div class="form-group"> 
    <label for="plandetail-code">Code</label> 
    <input type="text" name="plandetail-code" data-bind="textInput: code" class="form-control" /> 
</div> 

Мой контроллер действие является простым, но учтите, что code всегда приходит в качестве исходного значения:

[HttpPost] 
public string ValidatePlanCode(int? id, string code) { 
    return _service.ValidatePlanCode(id, code) ? "true" : "false"; 
} 

А вот мой ViewModel: я бегу form.Validate({}) перед применением привязок (пытался положить, что после того, как, а), и в методе saveChanges проверить form.valid():

function PlanDetailVM(model) { 

    var self = this; 

    self.originalModel = model; 
    self.form = $('#pgPlan-plan-detail-form'); 

    self.id = ko.observable(model.ID); 
    self.active = ko.observable(model.Active); 
    self.code = ko.observable(model.Code); 
    self.name = ko.observable(model.Name); 
    self.notes = ko.observable(model.notes); 

    self.dirty = ko.computed(function() { return isDirty(); }); 

    self.save = function() { saveChanges(); } 
    self.cancel = function() { cancelChanges(); } 

    ko.applyBindings(self, document.getElementById('pgPlan-detail-container')); 
    initValidation(self.form); 

    return self; 


    function initValidation(form) { 

     form.validate({ 
      rules: { 
       'plandetail-code': { 
        required: true, 
        remote: { 
         url: '/Plans/ValidatePlanCode', 
         type: 'POST', 
         data: { 
          id: self.id(), 
          code: self.code() //form.find('[name="plandetail-code"]').text() 
         } 
        } 
       }, 
       'plandetail-name': "required"      
      } 
     }); 

    } 

    function isDirty() { ... } 

    function saveChanges() { 

     if (!self.form.valid()) { 
      return; 
     } 

     // ajax snipped 
    } 

    function cancelChanges() { ... } 

} 

Repro:

  • нагрузки первоначальный вид, код имеет значение, AAAA
  • Изменить код для BBBB
  • Соблюдайте действие контроллера под названием
  • код действия контроллера param = AAAA

Я не уверен, почему я не могу получить последнее значение из ввода текста. Я что-то упускаю? Благодаря

ответ

2

rules является object, который оценивается сразу, поэтому объект data получит созданный со значениями по умолчанию, если вы используете self.id() (поскольку она возвращает значение не функция)

так что вы должны использовать его как функции

form.validate({ 
    rules: { 
    'plandetail-code': { 
     required: true, 
     remote: { 
     url: '/Plans/ValidatePlanCode', 
     type: 'POST', 
     data: { 
      id: self.id, // function evaluated at runtime 
      code: self.code 
     } 
     } 
    }, 
    'plandetail-name': "required" 
    } 
}); 
+0

Holy facepalm .... ok, ok ... спасибо. – jleach

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