调用knockoutjs viewmodel函数

时间:2016-12-29 13:22:48

标签: knockout.js viewmodel

这里是更好理解的背景:

我的主页面中有一个数据网格,每行都有一个按钮。当用户点击它时,它通过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函数 除了第一次。

欢迎任何帮助

2 个答案:

答案 0 :(得分:0)

您的代码中有一些很多有问题的点:

  • (Over)使用全局变量;
  • 笨拙的格式化(使其难以阅读和调试,但也很难帮助您);
  • 同步ajax调用(为什么?这很少是一个好主意,如果稍后将其更改为异步,可以再次破坏整个事情);
  • 使用ID = html.ID;
  • 覆盖可观察的属性
  • 使用您想要,
  • ;语法错误/问题
  • 根本没有公开observable:如果你没有公开它们,那么任何一些代码应该如何“看到”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();
    });