Knockoutjs计算未从observableArray更新

时间:2016-04-05 18:19:20

标签: javascript knockout.js

我希望在更新可观察数组时更新计算器。数组中填充了问题和答案(是或否)。当用户更改问题的答案时,我希望某个区域可见或不可见。

因此,如果其中一个问题已被回答is5B,那么计算出的"oui"应该为真,这应该会使这些部分可见。

is5B computed仅在初始化时计算,并且在更新数组时不会触发(它已更新,我使用断点检查)

以下是视图模型:

var section5Model = ko.validatedObservable({
    Questions5A: ko.observableArray(GetQuestions('5A')),
    Questions5B: ko.observableArray(),
    Questions5C: ko.observableArray(),
    ContactAQ: ko.observable(),
    Date: ko.observable(''),
    Heure: ko.observable(''),
    CategorisePar: ko.observable(''),
    DateCategorise: ko.observable(''),
    RepOuiNon: [{ label: 'Oui', value: 0 }, { label: 'Non', value: 1 }]
});

section5Model().is5B = ko.computed(function () {
    this.Questions5A().forEach(function (item) {
        if (item.reponse == 'Oui') {
            return true;
        }
    });
}, section5Model());

这是标记:

<div id="sectionContainer">
    <div id='S5FormBlock1' class="formSection5">
        <div id="QSection5A" data-bind="foreach: Questions5A">
            <div class='mockTable'>
                <div class="column200 centerLabel"><span data-bind="text: Texte"></span></div>
                <div class="grayRoundBorder padR10" data-bind="foreach: $parent.RepOuiNon">
                    <input type="radio" data-bind="value: label, attr : {name: $parent.ID}, checked: $parent.reponse" /><span data-bind="text: label"></span>
                </div>
            </div>
            <p />
        </div>
        <div data-bind="visible: is5B">Il s'agit d'une plainte qualité</div>
        <div id="QSection5B" data-bind="visible: is5B,foreach: Questions5B">
            <div class='mockTable'>
                <div class="column200 centerLabel"><span data-bind="text: Texte"></span></div>
                <div class="grayRoundBorder padR10" data-bind="foreach: $parent.RepOuiNon">
                    <input type="radio" data-bind="value: label, attr : {name: $parent.ID}, checked: $parent.reponse" /><span data-bind="text: label"></span>
                </div>
            </div>
            <p />
        </div>
        <div data-bind="visible: is5C">Il s'agit d'une plainte d'insatisfaction</div>
        <div id="QSection5C" data-bind="visible: is5C,foreach: Questions5C">
            <div class='mockTable'>
                <div class="column200 centerLabel"><span data-bind="text: Texte"></span></div>
                <div class="grayRoundBorder padR10" data-bind="foreach: $parent.RepOuiNon">
                    <input type="radio" data-bind="value: label, attr : {name: $parent.ID}, checked: $parent.reponse" /><span data-bind="text: label"></span>
                </div>
            </div>
            <p />
        </div>
    </div>
</div>

2 个答案:

答案 0 :(得分:2)

您遇到的问题是item.response无法观察到。所以如果它改变了KnockoutJS并不知道。要解决此问题,您必须将其更改为可观察

section5Model().is5B = ko.computed(function () {
    this.Questions5A().forEach(function (item) {
        if (item.reponse() == 'Oui') {
            return true;
        }
    });
}, section5Model());

答案 1 :(得分:0)

计算的是依赖于一个或多个其他可观察对象的函数,并且只要这些依赖项中的任何一个发生更改,它们就会自动更新。所以在你的情况下你的计算函数内没有可观察的。因此,将至少一个变量计算为可观察的。在您的情况下,请将item.response视为可观察的。为此,您需要在GetQuestions('5A')

上返回可观察变量

请像

那样执行Questions5A observableArray
 var section5Model = ko.validatedObservable({
        Questions5A: ko.observableArray([
                {reponse : ko.observable('reponse 1 ') },
                {reponse : ko.observable('reponse 2') },
                /* other objects */
        ]),      
        /* other code  */