首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >剔除观测射线不更新

剔除观测射线不更新
EN

Stack Overflow用户
提问于 2014-06-16 11:56:10
回答 1查看 142关注 0票数 0

我在更新observableArray时遇到了问题。我在这里一定遗漏了什么,但我所拥有的是:

我在主视图模型中存储了一个值列表,如下所示:

代码语言:javascript
复制
function AppViewModel() {
                var self = this;

                self.q1 = ko.observable().extend({ number: true });
                self.q2 = ko.observable().extend({ number: true });
                self.q3 = ko.observable().extend({ number: true });
                self.q4 = ko.observable().extend({ number: true });
                self.q5 = ko.observable().extend({ number: true });
.
.
.

我有一组计算平均值的计算函数。我还有一个单独的视图模型,用于使用jqxWidgets创建图表。这是代码:

代码语言:javascript
复制
function ChartModel(scores) {
                var self = this;
                var cat;

                self.scores = ko.observableArray(scores);

                self.scores.push({ cat: "Re", score: vm.reAve() });
                self.scores.push({ cat: "Da", score: vm.daAve() });
                self.scores.push({ cat: "De", score: vm.deAve() });
                self.scores.push({ cat: "Im", score: vm.imAve() });
                self.scores.push({ cat: "Ps", score: vm.psAve() });
                self.scores.push({ cat: "Overall", score: vm.reAve() });

                //alert(self.scores()[0].score);
                self.updateScores = function () {
                    var item = {};

                    item.cat = "Re";
                    item.score = vm.reAve();
                    self.scores.replace(self.scores()[0], item);
                    item.cat = "Da";
                    item.score = vm.daAve();
                    self.scores.replace(self.scores()[1], item);
                    item.cat = "De";
                    item.score = vm.deAve();
                    self.scores.replace(self.scores()[2], item);
                    item.cat = "Im";
                    item.score = vm.imAve();
                    self.scores.replace(self.scores()[3], item);
                    item.cat = "Ps";
                    item.score = vm.psAve();
                    self.scores.replace(self.scores()[4], item);
                    item.cat = "Overall";
                    item.score = vm.basAve();
                    self.scores.replace(self.scores()[5], item);

                };

            }

            var vm = new AppViewModel();
            var cm = new ChartModel(scores);

我在$(document).ready(...)块的末尾应用绑定。问题是,当调用scores函数时,updateScores永远不会更新:

代码语言:javascript
复制
<button id="btnLoad" data-bind="click: cm.updateScores">View Chart</button>

迫切需要帮助/建议。谢谢。

编辑:创建了一个小提琴,但不幸的是,这里没有工作。单选按钮应该更新各自的可观测值,然后计算总计值和平均值。它在我的项目中运行得很好,但我似乎无法准确地复制它。在过去的一个小时里一直被困在这个问题上。这是小提琴:

http://jsfiddle.net/JPQ55/1/

在我的项目中,我遇到的困难是observableArray值永远不会更新。我确定我错过了什么但我不知道.

编辑2 :

好的,在我的问题模型中,我试图取3个特定问题的分数,将它存储在一个可观察的数组中,然后计算出所选择的最大值。我似乎无法让UI更新以反映更改,而且console.log也没有向我展示任何内容:

代码语言:javascript
复制
function CategoryModel(cat) {
                var self = this;

                self.name = cat.name;
                self.itemsChosen = ko.observable();
                self.catquestion = ko.utils.arrayMap(cat.qs, function (q) {
                    return new CatQuestionModel(q.label, q.number);
                });

                self.catTotalScore = ko.computed(function () {
                    var total = 0, numItems = 0;

                    ko.utils.arrayForEach(self.catquestion, function (question) {
                        // note that ~~ converts its operand to integer (or 0 if that fails)
                        total += ~ ~question.score() + ~~question.mdaScoreM();

                        if (!(isNaN(question.score()))) {
                            ++numItems;
                            self.itemsChosen(numItems);
                        }
                    });

                    return total;
                }, self);

                self.catAvgScore = ko.computed(function () {

                    return parseFloat(self.catTotalScore() / (self.itemsChosen() || 1)).toFixed(2);
                });
            }

            function CatQuestionModel(question, number) {
                var self = this;
                self.question = question;
                self.number = number;
                self.score = ko.observable();
                self.mdaScore = ko.observable();
                self.mdaVals = ko.observableArray([]);

                if (self.number == "2" || self.number == "3" || self.number == "4")
                    self.mdaVals.push(ko.observable({ "number": self.number, "score": self.mdaScore() }));

                self.mdaScoreM = ko.computed(function () {
                    var x = 0;

                    x = ko.utils.arrayFirst(self.mdaVals(), function (i) {
                        return i.score === Math.max.apply(null, ko.utils.arrayMap(self.mdaVals(), function (e) {
                            return e.score;
                        }));
                    });

                    return x;
                }, self);

                self.mdaVals.notifySubscribers(self.mdaVals());
            }

mdaVals()是保存所有3个值的数组,mdaScore应该是获得的最大值。上面的代码有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-25 01:29:15

如果希望在数组中的对象上的值发生变化时更新页面上的值,则需要将对象上的每个值声明为可观察的值。

代码语言:javascript
复制
self.mdaVals = ko.observableArray([]);

self.mdaVals.push({ number: ko.observable(1), score: ko.observable(20)});

self.mdaVals()[0].number(2);

self.mdaVals()[0].score(10);

http://jsfiddle.net/tm5J9/1/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24243183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档