我有调用ajax GET的getGeneral函数.当ajax接收数据(json)时,它将根据给定的json创建KO模型,并返回创建的KO.
创建敲除模型并分配值后,应调用敲除applybindings.这是我的代码:
定义GeneralModel和一些相关功能(在“ GeneralModel.js”内部):
var GeneralModel = function() {
//for Now it is empty as data ar binded automatically from json
// CountryName is one of the properties that is returned with json
}
function getGeneral(pid) {
$.ajax({
url: "/api/general",
contentType: "text/json",
dataType: "json",
type: "GET",
data: { id: pid},
success: function (item) {
var p = new GeneralModel();
p = ko.mapping.fromJS(item);
return p;
},
error: function (data) {
}
});
}
这是从另一个文件(GeneralTabl.html)调用的,它应该调用get函数和applyBindings来更新UI:
var PortfolioGeneral = getGeneral("@Model.Id");
ko.applyBindings(PortfolioGeneral, document.getElementById("pv-portfolio-general-tab"));
但是,在这种情况下,我会收到错误消息(CountryName未定义).这是因为applyBindings在ajax返回数据之前发生,所以我正在对具有未定义属性的空模型进行applyBindings.
从Json到Model的映射在这里发生,并分配值:
p = ko.mapping.fromJS(item);
我也可以在所有字段中填写GeneralModel,但这不是必需的(我想):
var GeneralModel = function() {
CountryName = ko.observable();
...
}
解决办法是什么?
1)我可以以某种方式在GeneralModel内移动getGeneral,因此获取数据将成为GeneralModel初始化的一部分吗?
要么
2)也许我应该以某种方式“等待ajax结果”,然后才applyBindings?
要么
我相信还有其他选择,我只是不太了解KO和纯JS.
注意:我完全理解这是因为Ajax是Async调用,所以问题是考虑到我有两个单独的文件并且需要从外部调用getGeneral并应返回一些变量的情况下,如何重组此代码.
解决方法:
尝试使用返回的Promise接口:
function getGeneral(pid) {
return $.ajax({
url: "/api/general",
contentType: "text/json",
dataType: "json",
type: "GET",
data: {
id: pid
}
});
}
getGeneral("@Model.Id").done(function (item) {
var p = new GeneralModel();
p = ko.mapping.fromJS(item);
ko.applyBindings(p, document.getElementById("pv-portfolio-general-tab"));
}).fail(function () {
//handle error here
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。