【问题标题】:Recompute Computed Observable without resetting the objects在不重置对象的情况下重新计算 Computed Observable
【发布时间】:2015-01-09 09:07:39
【问题描述】:

我最近开始玩 Knockout,但遇到了一个问题。我已经尝试以各种方式谷歌搜索,但我找不到任何适用的结果。

假设我有这个模型:

var model = new function () {
    var that = this;

    this.parameterRegex = ko.observable(/\@@{1}\w+/ig);
    this.query = ko.observable('SELECT @@par1 from @@par2');
    this.parameterNames = ko.computed(function () {
        var allParameters = that.query().match(that.parameterRegex());
        return (allParameters == undefined) ? [] : jQuery.unique(allParameters);
    });
    this.parameters = ko.computed(function () {
        return ko.utils.arrayMap(that.parameterNames(), function (item) {
            return {
                Name: ko.observable(item),
                Example: ko.observable()
            }

        });
    });
};

在 HTML 中,我与 Parameters 计算的 observable 绑定,但每次 Query observable 更改和 Parameters observable 重新计算时,我都会丢失该计算项的所有状态。

我的意思是,如果我在 HTML 中将一个 foreach 与 Parameters 绑定,并且我在该 foreach 中有一些输入框,例如:

<textarea name="query" class="form-control" data-bind="value: query, valueUpdate:'afterkeydown'" rows="10" style="margin-bottom:20px"></textarea>
<div data-bind="foreach: parameters">
    <p data-bind="text: Name"></p>
    <input type="text"></input>
</div>

一旦重新计算 Computed Observeable,用户在输入中键入的任何文本都将丢失。

我将如何解决这个问题?

【问题讨论】:

  • 你能解释一下你的代码吗?参数数组是否发生了变化?如果它有什么变化呢?文本改变的面是计算函数的全部点。如果您不希望它发生变化,请不要将其设为计算值。
  • 参数数组根据字符串query变化。这被拆分为包含@@par1@@par2 的字符串数组。只要您更改字符串query 中的文本,就会重新计算计算结果
  • 那么是什么导致它发生变化?
  • 在我的原始帖子中,我添加了一个绑定到query 的新文本区域。当这种情况发生变化时,parameters 将被重新计算
  • 如果文本区域发生变化,你希望发生什么?

标签: javascript knockout.js computed-observable


【解决方案1】:

解决方案是保留一个单独的数组,其中包含对象,然后如果它们存在于数组中,则重新使用这些对象,而不是每次都重新创建它们。

var parameters = [];
this.parameters = ko.computed(function () {
    var newParams = [];
    for (var i = 0; i < that.parameterNames().length; i++) {
        var name = that.parameterNames()[i];
        var result = $.grep(parameters, function(p){ return p.Name() == name; });
        var param;
        if (result.length === 0) {
            param = {
                Name: ko.observable(name),
                Example: ko.observable()
            };
        }
        else {
            param = result[0];
        }

        newParams.push(param);
    }
    parameters = newParams;
    return newParams;
});

jsfiddle

【讨论】:

  • 这解决了您的问题吗?如果是这样,请选择我的答案作为解决方案。
猜你喜欢
  • 2018-09-02
  • 2014-01-16
  • 2010-09-15
  • 2016-05-31
  • 2017-03-11
  • 2021-10-27
  • 2014-04-17
  • 2014-01-13
  • 2017-06-04
相关资源
最近更新 更多