MVVM没有';t绑定数据
本文关键字:绑定 数据 没有 MVVM | 更新日期: 2023-09-27 18:00:27
我有一个剑道网格,其中有一个自定义命令按钮,当我按下该按钮时,我想打开一个新的剑道窗口,然后使用ajax调用来获取有关该产品的所有信息,并在该窗口中填充几个不同的表单。
这是弹出窗口中的我的html。
<div id="productinformation-form">
<div class="form-group">
<label for="id">Id</label>
<input data-bind="value: id" type="text" class="form-control" id="id" />
</div>
<div class="form-group">
<label for="unitmeasurement">Unit Measurement</label>
<input data-bind="value: unitMeasurement" type="text" class="form-control" id="unitmeasurement" />
</div>
<div class="form-group">
<label for="minorderqty">Unit Measurement</label>
<input data-bind="value: minOrderQty" type="text" class="form-control" id="minorderqty" />
</div>
<div class="form-group">
<label for="packsize">Pack Size</label>
<input data-bind="value: packSize" type="text" class="form-control" id="packsize" />
</div>
<div class="form-group">
<label for="leadTime">Lead Time</label>
<input data-bind="value: leadTime" type="text" class="form-control" id="leadTime" />
</div>
<div class="form-group">
<label for="generalaccessorycategoryid">General Accessory Categoryid</label>
<input data-bind="value: generalAccessoryCategoryId" type="text" class="form-control" id="generalaccessorycategoryid" />
</div>
<div class="form-group">
<label for="company">Company</label>
<input data-bind="value: Company" type="text" class="form-control" id="company" />
</div>
<div class="form-group">
<label for="weight">Weight</label>
<input data-bind="value: Weight" type="text" class="form-control" id="weight" />
</div>
<div class="form-group">
<label for="producttype">Product Type</label>
<input data-bind="value: ProductType" type="text" class="form-control" id="producttype" />
</div>
</div>
这是我得到上面视图的代码。
var dataItem = this.dataItem($(e.currentTarget).closest("tr"));
var id = dataItem.id;
var company = dataItem.Company;
console.log(id);
$.ajax({
url: '@Url.Action("EditProductView", "Product")',
type: 'POST',
dataType: 'html',
cache: false,
success: function(data) {
bindProductData(id, company, data);
},
error: function(xhr, error) {
},
});
这里是我获取产品信息的地方,然后尝试使用mvvm将其绑定到表单。
function bindProductData(id, company, html) {
bindProductInformation(id, company, html);
}
function bindProductInformation(id, company, html) {
$.ajax({
url: '@Url.Action("GetProductInformation", "Product")',
type: 'POST',
dataType: 'html',
data: { id: id, company: company },
cache: false,
success: function (data) {
$("#edit-product-window").kendoWindow({
modal: true
});
$("#edit-product-window").html(html);
console.log("PRODUCT");
console.log(data);
//var viewModel = kendo.observable({
// id: data.id
//});
var window = $("#edit-product-window").data("kendoWindow");
window.open();
window.center();
kendo.bind($("#productinformation-form"), data);
},
error: function (xhr, error) {
console.log("ERROR");
},
});
在我的kendo.bind中,对象数据如下所示:
{"id":"1068M","unitMeasurement":"1","minOrderQty":null,"packSize":null,"leadTime":null,"generalAccessoryCategoryId":null,"Company":"NORMSTAHL","Weight":null,"ProductType":1}
所以我认为它应该能够正确地绑定到表单。
编辑:如果我将代码更改为:
var viewModel = kendo.observable({
id: "asdasd"
});
var window = $("#edit-product-window").data("kendoWindow");
window.open();
window.center();
kendo.bind($("#productinformation-form"), viewModel);
它是有效的。然后,它在表单中键入asdasd作为id
但是如果我使用的数据是这样的帖子:
var viewModel = kendo.observable({
id: data.id
});
var window = $("#edit-product-window").data("kendoWindow");
window.open();
window.center();
kendo.bind($("#productinformation-form"), viewModel);
那它就不会打字了!
编辑2:如果我做console.log(数据),它会显示控制台中的整个对象。
但如果我做console.log(data.id),它会显示我未定义,即使数据显示对象包含id。
{"id":"1062M","unitMeasurement":"1","minOrderQty":null,"packSize":null,"leadTime":null,"generalAccessoryCategoryId":null,"Company":"NORMSTAHL","Weight":null,"ProductType":1}
正如您上面的评论,您的响应似乎是json string
而不是object
,这是由于您的AJAX请求规范data-type
在这里:
dataType(默认值:智能猜测(xml、json、script或html))
您期望从服务器如果未指定,jQuery将尝试根据响应的MIME类型(XMLMIME类型将产生XML,在1.4中JSON将生成一个JavaScript对象,在1.4中,脚本将执行脚本和其他任何内容都将作为字符串返回)。
dataType: 'html'
将其更改为
dataType: 'json'
它应该起作用。
AJAX文档
data
参数是一个对象,而不是剑道可观察对象。
http://docs.telerik.com/kendo-ui/framework/mvvm/overview
为了解决这个问题,你应该创建一个视图模型对象(在你的编辑中)
var viewmodel = kendo.observable({
id: 0,
unitMeasurement: '',
minOrderQty: 0,
//the rest of your properties
});
//bind the view model
$(function () {
kendo.bind($('#productinformation-form'), viewmodel)
});
然后,如果您真的不想手动绑定属性,您可以在数据对象上循环您的属性,例如(在ajax方法中)。
for (var property in data) {
if (property in viewmodel)
viewmodel[property] = data[property];
}
现在,您可以找到其他管理方法,但现在您可以扩展视图模型(作为适当的MVVM模式)来处理事件、源等。
使用这种方法还可以在视图模型上使用"get"answers"set"方法。这些在处理源代码时非常有用。你甚至可以扩展你的视图模型,在一个方法中接受和对象,并绑定自己,比如.
var viewmodel = kendo.observable({
id: 0,
unitMeasurement: '',
minOrderQty: 0,
//the rest of your properties
bindToData: function (data) {
for (var property in data) {
this.set(String(property), data[property]);
}
}
});
///...ajax call
success: function(data){
viewmodel.bindToData(data);
}