Javascript 击倒JS:indexOf总是返回-1? 背景

Javascript 击倒JS:indexOf总是返回-1? 背景,javascript,html,knockout.js,indexof,ko.observablearray,Javascript,Html,Knockout.js,Indexof,Ko.observablearray,我正在尝试建立一个成绩册应用程序,主要是作为一个学习练习。目前,我有两个模型,一个学生和一个作业。我决定将所有与分数相关的信息存储在学生内部,而不是存储在每个作业中。也许有更好的方法 不管怎样,我已经有了每个学生的平均分数,即她在班上的成绩。我现在要计算每个作业的平均分数。这就是我遇到麻烦的地方,因为这有点棘手。我目前正在使用以下方法: JS-Bin(整个项目): JS 我通过以下方式将其绑定到HTML: HTML 班级作业平均数 问题是我在这里做的一些事情——我认为是workMean()方

我正在尝试建立一个成绩册应用程序,主要是作为一个学习练习。目前,我有两个模型,一个学生和一个作业。我决定将所有与分数相关的信息存储在学生内部,而不是存储在每个作业中。也许有更好的方法

不管怎样,我已经有了每个学生的平均分数,即她在班上的成绩。我现在要计算每个作业的平均分数。这就是我遇到麻烦的地方,因为这有点棘手。我目前正在使用以下方法:

JS-Bin(整个项目):

JS 我通过以下方式将其绑定到HTML:

HTML

班级作业平均数
问题是我在这里做的一些事情——我认为是
workMean()
方法——完全破坏了我的应用程序。在尝试调试时,我注意到如果我简单地注释掉整个方法save
I
,然后返回
I
,并将其绑定到较低的
foreach:assignments
,它将一致地返回
-1
(对于每个赋值)

淘汰赛文档告诉我,这意味着当我调用
indexOf
时没有匹配项,但我不知道为什么。感谢您的指导。

除了“可观察到的物体不带参数”这一问题之外,您还有另一个问题:

score = parseFloat(student.scores()[i]);
应该是

score = parseFloat(student.scores()[i]());
您访问的可观察数组的第n个(或第i个)元素本身就是一个可观察的元素,因此在此之前,您将函数传递给
parseFloat
,它总是产生NaN

以下是一个工作版本:

顺便说一句:在数据命令更改后

<td data-bind="text: $root.workMean($data, $index())"></td>

约束一个正常函数,而不是一个可观察函数。那么为什么这仍然有效呢

:

在Knockout中,绑定在内部使用dependentObservable实现,因此实际上可以在绑定中使用普通函数代替dependentObservable。绑定将在DependentToServable中运行您的函数,因此任何访问其值的可观察对象都将创建一个依赖项(当绑定发生更改时,它将再次触发)

(在早期版本的Knockout中,计算出的可观测值被称为“dependentObservables”)

对于这些类型的问题,熟悉调试器(如中的调试器)确实有帮助。能够逐行检查代码并查看实际包含的参数和变量是非常有帮助的

调试绑定时值得使用,因为您可以单击任何DOM元素并查看绑定上下文:

最后,在控制台中使用
ko.dataFor()
可以查看绑定到DOM的任何现有淘汰模型和viewmodels:


在Chrome控制台中,
$0
始终是您当前在“元素”面板中选择的DOM元素的引用-这里是一个

您好:)由于我已经熟悉您的代码,我一回到办公桌前就会看一看。您误解了
ko.computed
的用法。它不接受参数,当其值所依赖的观测值发生变化时,它用于计算值。编辑:请参见-我将
workMean
转换为一个普通函数,该函数接收循环项及其索引作为参数,并对某些似乎不确定的地方进行了一些其他更改。我想我不清楚“其值取决于”的确切含义。不管是哪种方式,您的编辑似乎确实改善了情况,而且现在不再那么冗长了。当创建
ko.computed
时,knockout调用它以获得其初始值,并使用一些魔法来跟踪调用期间使用的观察值。稍后,当这些观察值中的任何一个改变其值时,knockout将重新运行计算函数以获得其新值。这就是我所说的“它的价值取决于”。与knockout中的其他内容一样,计算出的
值应仅取决于可观测值,因此可以自动更新。“计算出的值应仅取决于可观测值”(强调部分已添加)-这一部分尤其有用。谢谢你知道为什么
workMean
方法返回N/A(明显的
else{return'N/A'}
)吗?回答了我的问题,解决了我的问题,为将来的调试提供了工具。太遗憾了,我不能+1这个两次,谢谢!
<td data-bind="text: $root.workMean($data, $index())"></td>