【问题标题】:How can I update a complex knockout observable programatically?如何以编程方式更新复杂的淘汰赛 observable?
【发布时间】:2016-02-04 04:23:08
【问题描述】:

我在这里使用 durandal/requirejs/knockout。 我也在使用 coderenaissance 插件进行映射 (ko.viewmodel.updateFromModel(ziitem, data)。)

我从我的 ajax 调用中获取以下数据,并将其映射到我的 zitem observable 中。

{
    "itemNumber" : "ABATAH000",
    "effectiveDate" : "2015-11-03T15:30:05.7118023-05:00",
    "expiryDate" : "2015-05-03T15:30:05.7118023-04:00",
    "minimumPremium" : 25,
    "zSubItems" : [{
            "zSubItemName" : "Mine",
            "unitDistance" : 100000,
            "zSubSubItems" : [{
                    "zSubSubItemName" : "CoverageA",
                    "zSubSubItemPremium" : 100.0,
                    "id" : 0
                }
            ],
            "id" : 1
        }
    ],
    "id" : 0
}

这是我正在使用的视图模型:

define(['plugins/http', 'durandal/app', 'knockout', 'services/datacontext'],
    function (http, app, ko, datacontext) {
    var zitem = ko.observable();

    var activate = function () {
        //This is just a wrapper around an ajax call.
        return datacontext.getPolicy("value")
            .then(function(data) {
                ko.viewmodel.updateFromModel(zitem, data);
            });
    };

    var updateMinimumPremium = function (thisItem) {
        //This doesn't work
        zitem.minimumPremium(thisItem.minimumPremium + 1);
    };

    return {
        displayName: 'zitem example',
        zitem: zitem,
        updateMinimumPremium: updateMinimumPremium,
        activate: activate

    };
});

我将 updateMinimumPremium 绑定到单击与 minimumPremium 元素处于同一级别的按钮。

<button data-bind="click: $parent.updateMinimumPremium">Add 1</button>

如何以编程方式更新 [minimumPremium] 或 [zSubSubItemPremium]?

【问题讨论】:

  • 可能是 ... zitem.minimumPremium(thisItem.minimumPremium() + 1); ... minimumPremium 将是可观察的。
  • 什么不起作用?当值改变时,你的视图重绘?
  • @Sam.C 不幸的是 thisItem 来自似乎不可观察的参数(与上面声明的所有项目都是可观察的 ziitem 相反。)
  • 我指的是“minimumPremium”作为一个可观察的而不是“thisItem”。它应该是一个可观察的,否则 ziitem.minimumPremium( ... 将首先不起作用,如果不是这种情况,它应该在这一点上给你一个 javascript 错误)。在同一行中,您在应该是“thisItem.minimumPremium() + 1”的地方添加“1”(thisItem.minimumPremium + 1)。
  • 回顾你的问题,它需要一点澄清,我已经在这个 jsfiddle "jsfiddle.net/5oLtz0xa/9" 中从你的标记中破解了一个工作代码......查看脚本并添加一些澄清如果可以的话,回答你的问题

标签: javascript knockout.js


【解决方案1】:

“minimumPremium”是可观察到的

zitem.minimumPremium(thisItem.minimumPremium() + 1);

【讨论】:

    【解决方案2】:

    你的zitem 也是可观察到的,所以试试这个:

    zitem().minimumPremium(thisItem.minimumPremium + 1);
    

    在实际应用中不要忘记检查 zitem() 调用的值 - 它可以未初始化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-10
      • 2019-06-02
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      相关资源
      最近更新 更多