【问题标题】:Knockout bug? applyBindings doesn't work (Asp.net mvc4 mobile)淘汰错误? applyBindings 不起作用(Asp.net mvc4 移动版)
【发布时间】:2012-09-25 08:46:01
【问题描述】:

我有一个包含三个视图模型的视图:Grower、Branch 和 GrowerList。

有两个按钮,Grower 和 Branch。 GrowerList 取决于所选的分支。

场景如下: 1. 当用户来到那个页面时,会显示一个分支列表(BranchList)。 (使用 jQuery mobile 的 listview 显示列表)。

  1. 用户从BranchList中选择一个Branch

  2. 用户可以点击“Grower”按钮显示种植者列表,然后可以选择种植者。

  3. 单击“种植者”按钮时,将显示种植者列表 (GrowerList)。 GrowerList 取决于所选的分支 ID。

Grower、Branch 和 GrowerList,每个都有一个 ViewModel。我正在执行以下操作来显示更新后的 GrowerList:

     $("#btnGrower").click(function () {
     ko.applyBindings(new GrowerListModel(), document.getElementById("divGrowerList"));
     });

GrowerList 的 ViewModel 如下所示:

    function MyGrower(data) {
     this.Id = ko.observable(data.GrowerId);
     this.name = ko.observable(data.GrowerName);
    }

    function MyGrowerListModel() {
     // Data
     var self = this;
     self.growers = ko.observableArray([]);

     //Load initial state from server and populate viewmodel
     $.getJSON("Grower/GetGrowers", function (allData) {
     var mappedUsers = $.map(allData, function (item) { return new MyGrower(item) });
     self.growers(mappedUsers);
     });
    }

还有,我绑定值的地方:

    <div id="divGrowerList">
           <ul data-bind="foreach: growers" data-role="listview" id="ulGrowerList">
              <li><a data-bind="attr: {id: Id}"><span data-bind="text: name" /></a></li>
          </ul>

    </div>

问题是,虽然我通过 Firebug 看到正确的数据来自 GetGrowers 方法,但除了第一次单击 Grower 按钮时,GrowerList 没有显示任何内容。我究竟做错了什么?没有 javascript 错误。

【问题讨论】:

    标签: knockout.js asp.net-mvc-4


    【解决方案1】:

    对于视图模型和视图,您应该只applyBindings 一次。再次调用它,事情将不会像您在这里看到的那样工作。

    您应该做的是在初始加载时应用绑定一次,并调用将growers 设置为新值数组的方法。使用敲除的绑定来处理点击事件比在这里混合 jquery 更容易。

    <button data-bind="click: updateGrowers"></button>
    
    function MyGrowerListModel() {
        // Data
        var self = this;
        self.growers = ko.observableArray([]);
    
        self.updateGrowers = function () {
            $.getJSON("Grower/GetGrowers", function (allData) {
                var mappedUsers = $.map(allData, function (item) { return new MyGrower(item) });
                self.growers(mappedUsers);
            });
        };
    
        //Load initial state from server and populate viewmodel
        self.updateGrowers();
    }
    

    然后,每次单击按钮都会调用视图模型上的 updateGrowers 函数,该函数又会更新该数组。

    【讨论】:

    • 感谢您的回复。我对淘汰赛和 jquery 很陌生,而且我的 javascript 技能有限(谈论最糟糕的组合!)。你能建议在这种情况下我应该如何构建我的 ViewModel 吗?再次感谢!
    • 为了给你更多的细节,GrowerInfo(按钮)、BranchInfo(按钮)、GrowerList(列表视图)和BranchList(列表视图)都来自数据库。当在 GrowerList 中选择了一个种植者时,应该通过再次从数据库中获取“GrowerInfo”对象来更新 GrowerInfo,对于 Branch 和 BranchList 也会发生同样的情况。 GrowerList 依赖于BranchID(从BranchList 中选择的Branch),所以当一个Branch 被选中时,BranchInfo 和GrowerList 都会发生变化。我为 GrowerInfo、BranchInfo 和 GrowerList 使用 3 个视图模型,并在它们的点击事件中为每个 div 执行 applyBindings。请帮忙!
    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 2013-02-12
    • 2016-05-20
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    相关资源
    最近更新 更多