这里是更好理解的背景:
我的主页面中有一个数据网格,每行都有一个按钮。当用户点击它时,它通过ajax jquery加载另一个页面并在bootstrap模式对话框中弹出它:
<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>
AddEditPRD.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>
当我第一次点击按钮时它起作用,但之后没有。
控制台上没有错误,似乎没有触发loadproduct函数 除了第一次。
欢迎任何帮助
答案 0 :(得分:0)
您的代码中有一些很多有问题的点:
ajax
调用(为什么?这很少是一个好主意,如果稍后将其更改为异步,可以再次破坏整个事情); ID = html.ID
; ,
;
语法错误/问题
ID
等等?alreadyloaded
sortoff的组合作为布尔值,而它是一个数字(与==
进行比较而不是更安全的===
)if...else
回调中完成ready
?不管怎样,它应该被召唤...... 解决所有这些问题,很可能会找到问题的根本原因。
答案 1 :(得分:0)
我认为这种淘汰和DOM操作的混合是有问题的...你可以用更纯粹的淘汰赛解决方案来做到这一点。
话虽这么说,我认为问题在于你如何修改数据......你必须通过将它们包装在括号中来更新observable,否则knockout将不会更新视图,尽管它会与non进行'一次'绑定 - 可观察的数据。用一个范围变量(比如self)跟踪这个也是一个好习惯,所以你不会在不同的上下文中得到奇怪的范围问题:
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();
});