gpt4 book ai didi

javascript - knockout 和 jQuery 验证远程 : not getting latest value

转载 作者:行者123 更新时间:2023-11-30 15:30:53 25 4
gpt4 key购买 nike

我有一个 knockout viewModel 并且正在为它连接 jQuery Validation。其中一个值 code,我想要远程检查以确保它尚未被使用。问题是在我的远程验证方法中,self.code() 调用返回旧值而不是新值。

我的验证代码(请注意,我还尝试了一种“更直接”的获取值的方法,但无济于事 - 结果相同):

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>

我的 Controller 操作很简单,但请注意 code 始终作为原始值出现:

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

这是我的 View 模型:我在应用绑定(bind)之前运行 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() { ... }

}

复制:

  • 加载初始 View ,Code 的值为 AAAA
  • 将代码更改为 BBBB
  • 观察调用的 Controller Action
  • Controller 操作代码 param = AAAA

我不确定为什么无法从文本输入中获取最新值。我错过了什么吗?谢谢

最佳答案

rules 是一个立即计算的对象,因此如果您使用 self,data 对象将使用默认值创建.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"
}
});

关于javascript - knockout 和 jQuery 验证远程 : not getting latest value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42257823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com