Knockout.js 调用knockoutjsviewmodel函数
以下是更好理解的上下文: 我的主页上有一个datagrid,每行有一个按钮。当用户单击它时,它将通过ajax jquery加载另一个页面,并在引导模式对话框中弹出:Knockout.js 调用knockoutjsviewmodel函数,knockout.js,viewmodel,Knockout.js,Viewmodel,以下是更好理解的上下文: 我的主页上有一个datagrid,每行有一个按钮。当用户单击它时,它将通过ajax jquery加载另一个页面,并在引导模式对话框中弹出: <script> var sharedadminID = 0; var alreadyloaded = 0; ... function EditClick(args) { var gridObj = $("#DetailsGrid").data("ejGrid");
<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>
var sharedadminID=0;
var-alreadyloaded=0;
...
函数编辑单击(args){
var gridObj=$(“#DetailsGrid”).data(“ejGrid”);
var data=gridObj.getSelectedRecords()[0].ID;
sharedadminID=数据;
$(“#prdmodalbody”).load(“pages/modals/AddEditPRD.html”);
}
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>
var PRDVM=函数(){
ID=ko.可观察();
名称=可观察的ko();
PRIX=ko.可观察();
loadproduct=函数(){
警报(“innerloadproduct2222”);
jQuery.ajax({
url:“/Admin/GetProduct?i=“+sharedadminID,
成功:函数(html){
ID=html.ID,
名称=html.DESIGNATION,
PRIX=html.PRIX
},
异步:false
});
}
loadproduct();
};
$(文档).ready(函数(){
if(alreadyloaded==0){
VM=新的PRDVM();
ko.applyBindings(VM,document.getElementById(“#prdmodalbody”);
alreadyloaded=1;
}
其他的
VM.loadproduct();
});
当我第一次点击按钮时,它就起作用了,但之后就不起作用了
控制台上没有错误,并且似乎没有启动loadproduct函数
除了第一次
欢迎任何帮助您的代码中有很多问题:
- (过度)使用全局语言李>
- 笨拙的格式(使其难以阅读和调试,但也难以帮助您)李>
- 同步
调用(为什么?这很少是个好主意,如果稍后将其更改为异步,可能会再次破坏整个过程)李>ajax
- 用
覆盖可观察属性李>ID=html.ID
- 语法错误/问题,在您想要的地方使用
代码>,
- 根本不公开可观察对象:如果不公开它们,那么任何代码位应该如何“看到”
等等ID
sortoff的组合用作布尔值,而它是一个数字(与alreadyloaded
相比,而不是更安全的=
)=
- 为什么要在
回调中执行ready
?无论如何,它应该被调用一次if…else
修复所有这些问题,您很可能会找到问题的根本原因。我认为这种敲除和DOM操作的组合是有问题的。。。你可以在一个更纯粹的淘汰方案中做到这一点 尽管如此,我认为问题在于如何修改数据。。。您必须通过将可观察数据包装在括号中来更新它们,否则,knockout将不会更新视图,尽管它将对不可观察数据进行“一次性”绑定。使用作用域变量(如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();
});
observable被正确地公开和绑定,并使用ajax调用结果进行更新,每次我单击父页面的edit按钮时都会调用ready函数无论如何,我主要关心的是知道为什么loadproduct方法只在第一次触发。谢谢,它们不是,您帖子中的
observable
变量(如ID
)在视图模型构造函数实例之外不可见。清楚地显示了差异,因为这确实使用了self=this
习惯用法暴露了它们。