Javascript &引用;“类型”中不存在属性;

Javascript &引用;“类型”中不存在属性;,javascript,html,angular,typescript,Javascript,Html,Angular,Typescript,我最近开始学习角度,目前正在做一项作业,这是关于用半径输入制作一个表格。完成表格后,我现在正在检查答案是否正确,但在检查时我发现两个错误。我试图做的是,从数组中删除所有不正确的答案(值=0) 这是HTML文件: <form> <div class="container" *ngFor = "let question of questions"> <h4>{{question.question}}</h4> <label

我最近开始学习角度,目前正在做一项作业,这是关于用半径输入制作一个表格。完成表格后,我现在正在检查答案是否正确,但在检查时我发现两个错误。我试图做的是,从数组中删除所有不正确的答案(值=0)

这是HTML文件:

 <form>
  <div class="container" *ngFor = "let question of questions">
    <h4>{{question.question}}</h4>
    <label class="radio" *ngFor="let alternative of question.alternatives">
      <input class="subtotal" type="radio" name="{{question.question}}" value="{{alternative.value}}"> {{alternative.answer}}
    </label>
  </div>
</form>
在“半径拼接(索引,1);”中,我得到:


[ts]类型“NodeListOf”上不存在属性“splice”您看到的是类型错误

调用
document.querySelectorAll
时,它返回一个
节点列表
,因为它不知道匹配的元素将是
s,它是
的超类

第二个问题是
NodeList
没有
splice
方法

要解决第一个问题,您可以为
radius
变量指定一个类型:

let radius: NodeList<HTMLInputElement> = document.querySelectorAll(".subtotal:checked");
现在,每当用户编辑输入时,
question.answer
属性就会自动更新。在组件中,您可以在结构上迭代以删除无效的替代方案:

sumValue(){

    this.questions.forEach(question => {
        question.alternatives = question.alternatives.filter(a => a.value != 0);
    });

}
此代码使用创建一个数组,数组中只包含值不等于零的元素。然后,我们可以使用它来替换旧的
备选方案
数组。Angular将处理渲染页面以反映数据中的更改


.

在直接使用value属性之前,请检查该属性是否存在console.log(radius[index].value)显示控制台上的值,但它表示这些值不存在。如何检查它是否存在或声明它?谢谢检查每个项目的值是否存在。可能发生的情况是,某些项的值存在,而其他项的值不存在。然后它会抛出错误。所以检查一下,如果(radius[index]&&radius[index].value){……}并且顺便说一句,您不能在节点列表中使用拼接。querySelectorAll返回一个与数组不同的节点列表。你不能在Nodelist上使用splice()、push()、join()、indexOf()和许多其他方法。哦,我明白了,该死的,我再也不知道如何从数组中获取值了。谢谢!这解决了编译问题,但也导致了另一个问题。控制台现在记录“错误:如果在表单标记中使用ngModel,则必须设置name属性,或者必须在ngModelOptions中将表单控件定义为‘独立’。”。我尝试为它设置一个名称,或者使用[ngModelOptions]=“{standalone:true}”,当我这样做时,编译不会出错,但当我选择一个选项时,它会标记所有10个问题中的最后一个错误答案,或者如果选择的第一个答案是正确的,则标记所有问题中的正确答案。我真的很感谢你的帮助!我删除了表单标记,因为我没有使用它的任何属性,并将其更改为div。现在我没有看到控制台错误,但所有错误或正确选项都存在的错误。有没有关于为什么会发生这种情况以及如何解决它的想法?如果你制作并共享一个Plunkr,我可以帮助它工作。这是一个空的Angular Plunk:当页面中有一个表单元素时,Angular要求它有一个名称,以便跟踪和验证输入。你能改用name=“{{question.question}}”吗?
[ts] Property 'splice' does not exist on type 'NodeListOf<Element'.
let radius: NodeList<HTMLInputElement> = document.querySelectorAll(".subtotal:checked");
 <form>
  <div class="container" *ngFor = "let question of questions">
    <h4>{{question.question}}</h4>
    <label class="radio" *ngFor="let alternative of question.alternatives">
      <input class="subtotal" type="radio" [attr.name]="question.question" [value]="alternative.value" [(ngModel)]="question.answer"> {{alternative.answer}}
    </label>
  </div>
</form>
sumValue(){

    this.questions.forEach(question => {
        question.alternatives = question.alternatives.filter(a => a.value != 0);
    });

}