在此上下文以更好地理解:
我的主页上有一个数据杂志,每行都有一个按钮。当用户单击它时,它通过ajax jquery加载另一个页面,然后将其弹出在引导模态对话框中:
<script>
var sharedadminID = 0;
var alreadyloaded = 0;
...
function EditClick(args) {
var gridObj = $("#DetailsGrid").data("ejGrid");
var data = gridObj.getSelectedRecords()[0].ID;
sharedadminID = data;
$("#prdmodalbody").load("pages/modals/AddEditPRD.html");
}
</script>
additprd.html页面的ViewModel所定义为
<script>
var PRDVM = function () {
ID = ko.observable();
DESIGNATION = ko.observable();
PRIX = ko.observable();
loadproduct = function () {
alert("innerloadproduct2222");
jQuery.ajax({
url: "/Admin/GetProduct?i=" + sharedadminID,
success: function (html) {
ID = html.ID,
DESIGNATION = html.DESIGNATION,
PRIX = html.PRIX
},
async: false
});
}
loadproduct();
};
$(document).ready(function () {
if (alreadyloaded == 0) {
VM = new PRDVM();
ko.applyBindings(VM, document.getElementById("#prdmodalbody"));
alreadyloaded = 1;
}
else
VM.loadproduct();
});
</script>
第一次单击按钮时它可以工作,但之后却不是。
控制台上没有错误,并且似乎没有触发载荷功能除了第一次。
任何帮助s欢迎
您的代码中有问题点的 lot :
- (过度)使用全球;
- 尴尬的格式(很难阅读和调试,但也很难为您提供帮助);
- 同步
ajax
调用(为什么?这很少是一个好主意,如果您以后将其更改为async,则可以再次打破整个事情); - you 覆盖
ID = html.ID
;
的可观察属性 - 语法错误/问题,使用
,
您打算;
- 完全不暴露观察物:如果您不揭露它们的任何一个代码应该如何"查看"
ID
等等? -
alreadyloaded
分隔用作布尔值的组合,而它是一个数字(与==
相比而不是更安全的===
) - 为什么在
ready
回调中完全执行if...else
?无论如何,它应该被称为...
解决所有这些问题,很可能您会找到问题的根本原因。
我认为敲除和DOM操纵的混合是有问题的...您可能可以在更纯净的敲除解决方案中这样做。
话虽如此,我认为问题是您如何修改数据...您必须通过将它们包裹在括号或淘汰赛中来更新可观察的信息,但不会更新视图 - 观察数据。这也是一个很好的习惯,可以使用范围的变量(例如自我)跟踪这一点,这样您就不会在不同的情况下遇到奇怪的范围范围:
var PRDVM = function () {
var self = this;
self.ID = ko.observable();
self.DESIGNATION = ko.observable();
self.PRIX = ko.observable();
self.loadproduct = function () {
alert("innerloadproduct2222");
jQuery.ajax({
url: "/Admin/GetProduct?i=" + sharedadminID,
success: function (html) {
self.ID(html.ID);
self.DESIGNATION(html.DESIGNATION);
self.PRIX(html.PRIX);
},
async: false
});
}
self.loadproduct();
};
$(document).ready(function () {
if (alreadyloaded == 0) {
VM = new PRDVM();
ko.applyBindings(VM, document.getElementById("#prdmodalbody"));
alreadyloaded = 1;
}
else
VM.loadproduct();
});