【问题标题】:Passing Click Event from within one view model to another view model using knockout.js使用 knockout.js 将单击事件从一个视图模型中传递到另一个视图模型
【发布时间】:2026-01-13 16:00:01
【问题描述】:

我正在使用来自 Knockout.JS 站点 (http://jsfiddle.net/rniemeyer/QSRBR/) 的分页网格示例来构建网格。我在网格模板中声明了一个点击事件,如下所示(点击:goBackward):-

templateEngine.addTemplate("ko_negrid_navigation", "\
                    <div class=\"ko-grid-pageLinks\">\
                        <br/>\
                        <span><img src=\"/OCSENET/images/bluLeftNew.gif\" style=\"cursor:hand;\" alt=\"Backward\" data-bind='click: goBackward, visible: shouldShowBack'  /></span>\
                        <span>&nbsp;</span>\
                        <span><img src=\"/OCSENET/images/bluRightNew.gif\" style=\"cursor:hand;\" alt=\"Forward\"  data-bind='click: goForward, visible: shouldShowFwd'  /></span>\
                    </div>");

现在我需要在调用此 Grid ViewModel 的 ViewModel 中定义此 goBackward 方法,而不是在此 Grid View Model 自身中定义此方法。当我这样做时,事件不会触发 goBackward()。我正在从另一个 TestViewModel 调用 Grid,如下所示:

/*----------------------------------------------------------------------*/
/* TEST View Model
/*----------------------------------------------------------------------*/
function TESTViewModel() {
    var self = this;

    self.iRowFrom = ko.observable(1);
    self.iRowTo = ko.observable(5);
    self.gridRowCount = ko.observable(5);

    self.VM_AHISGrid;
    self.GridItems = ko.observableArray([]);    

    //fnDesignGrid
    self.fnDesignGrid = function () {
        self.VM_AHISGrid = new ko.NEGrid.viewModel({
            data: self.GridItems,
            columns: [
                        { headerText: "Address", rowText: "AHIS_Address" },
                        { headerText: "City", rowText: "AHIS_Addr_City" },
                        { headerText: "State", rowText: "AHIS_Addr_State" },
                        { headerText: "Zip", rowText: "AHIS_Addr_Zip" }
                    ],
            pageSize: self.gridRowCount(),
            gridName: 'ALST_NE_GRID'
        });
    }

    // I want this method to be triggered.
    self.goBackward = function () {
        alert('I m Backward')
    };  

}

【问题讨论】:

    标签: mvvm knockout.js


    【解决方案1】:

    好的,我修好了。很简单,只需定义调用viewmodel的方法如下,它就像魅力一样。

    self.NEGridViewModel.goBackward = function () {
            alert('I m Backward')
        };
    

    【讨论】:

      【解决方案2】:

      如果您的网格是您的视图模型的子级,那么在您的分页器模板中,您需要执行click: $parent.goBackwardclick: $root.goBackward 之类的操作来绑定位于更高范围级别的函数。

      【讨论】:

      • 我试过这样做,但它不起作用。如果我将此方法全局放置在它被调用的任何视图模型之外,但如果它是在调用视图模型中定义的,那么它不会。
      • 你能在 jsFiddle 中放一些东西来证明这个问题吗?可以帮助的一件事是尝试了解$parent$root 在被绑定时的含义。就像在你的点击绑定旁边放一个假绑定一样简单,比如click: $root.goBackward, blah: console.log($root)
      最近更新 更多