Knockout.js 调用knockoutjsviewmodel函数

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");

以下是更好理解的上下文:

我的主页上有一个datagrid,每行有一个按钮。当用户单击它时,它将通过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>

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
    等等
  • alreadyloaded
    sortoff的组合用作布尔值,而它是一个数字(与
    =
    相比,而不是更安全的
    =
  • 为什么要在
    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
习惯用法暴露了它们。