Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 敲除集合链接绑定错误_Javascript_Html_Mvvm_Knockout.js - Fatal编程技术网

Javascript 敲除集合链接绑定错误

Javascript 敲除集合链接绑定错误,javascript,html,mvvm,knockout.js,Javascript,Html,Mvvm,Knockout.js,这是我的击倒视图模型 $(document).ready( function () { var Crime = function (CaseNumber, DateOfIncident, Description) { this.CaseNumber = CaseNumber; this.DateOfIncident = DateOfIncident; this.Description = Descr

这是我的击倒视图模型

$(document).ready(
    function () {

        var Crime = function (CaseNumber, DateOfIncident, Description) {
            this.CaseNumber = CaseNumber;
            this.DateOfIncident = DateOfIncident;
            this.Description = Description;
        }

        var crimes = function (items) {
            var self = this;
            //Data
            self.items = ko.observableArray(items)

            //operations
            self.addCrime = function () {
                if ($("#AddCrimeForm").valid()) {
                    self.crime = new Crime($("#CaseNumber").val(), $("#DateOfIncident").val(), $("#Description").val());
                    //var JSONObj = { CaseNumber: $("#CaseNumber").val(), DateOfIncident: $("#DateOfIncident").val(), Description: $("#Description").val() };
                    self.items.push(this.crime);

                    $("#CaseNumber").val("");
                    $("#DateOfIncident").val("");
                    $("#Description").val("");
                }
            }

            self.removeCrime = function (item) {
                self.items().remove(item);
            }

        }

        var initialData = new Array();
        ko.applyBindings(crimes(initialData), $("#CrimeList")[0])
    }
);
以下是我的HTML视图:

<form id="AddCrimeForm">
    <div class="panel panel-success">
        <div class="panel-heading">
            <div class="form-horizontal">
                <div class="row">
                    <div class="col-lg-11">Add a crime incident to the list</div>
                    <div class="col-lg-1">
                        <button type="button" class="btn btn-success btn-xs" onclick="addCrime()"><i class="fa fa-plus"></i> Add</button>
                    </div>
                </div>
            </div>
        </div>

        <div class="panel-body">
            <div class="form-horizontal">
                <div class="row">
                    <div class="col-lg-6">
                        <input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Id" name="Id" type="hidden" value="">
                        <div class="form-group">
                            <label class="control-label col-md-4" for="CaseNumber">Case Number</label>
                            <div class="col-md-8">
                                <input class="form-control text-box single-line" data-val="true" data-val-required="The Case Number field is required." id="CaseNumber" name="CaseNumber" type="text" value="">
                                <span class="field-validation-valid" data-valmsg-for="CaseNumber" data-valmsg-replace="true"></span>
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="control-label col-md-4" for="DateOfIncident">Date Of Incident</label>
                            <div class="col-md-8">
                                <input class="form-control text-box single-line valid" data-val="true" data-val-required="The Date of Incident field is required." id="DateOfIncident" name="DateOfIncident" type="date" value="">
                                <span class="field-validation-valid" data-valmsg-for="DateOfIncident" data-valmsg-replace="true"></span>
                            </div>
                        </div>
                    </div>
                    <div class="col-lg-6">
                        <div class="form-group">
                            <label class="control-label col-md-4" for="Description">Description</label>
                            <div class="col-md-8">
                                <textarea class="form-control text-box multi-line" data-val="true" data-val-required="The Description field is required." id="Description" name="Description"></textarea>
                                <span class="field-validation-valid" data-valmsg-for="Description" data-valmsg-replace="true"></span>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</form>

<table class="table table-striped table-hover " id="CrimeList">
    <thead>
        <tr>
            <th>Case Number</th>
            <th>Date of Incident</th>
            <th>Description</th>
            <th></th>
        </tr>
    </thead>
    <tbody data-bind="foreach: items">
        <tr>
            <td data-bind="text: $data.CaseNumber" class="col-lg-2">Column content</td>
            <td data-bind="text: $data.DateOfIncident" class="col-lg-2">Column content</td>
            <td data-bind="text: $data.Description" style="text-wrap: normal" class="col-lg-7">Column content</td>
            @*<td></td>
                <td></td>
                <td></td>*@
            <td style="text-align: center" class="col-lg-1">
                <a href="#" data-bind="click: $root.removeCrime()"><i class="fa fa-trash-o"></i> Remove</a>
            </td>
        </tr>
    </tbody>
</table>
添加项时出现的错误与表中删除链接的绑定有关,如下所示:

中第58行第363列的未处理异常 http://localhost:49803/Scripts/KnockOut/knockout-3.0.0.js

0x800a138f-JavaScript运行时错误:无法获取属性 未定义或空引用的“removeCrime”


现在,我不确定这里的问题是什么,因为我应该绑定到根,因为removeCrime方法驻留在ViewModel的根中?

您正在窗口对象上设置removeCrime函数,因为函数在全局范围内执行,这指向窗口


设置viewModel时尝试使用new关键字。这将创建新对象并将其设置为。 如果要在敲除之外调用add方法,还应该将其附加到窗口。
另一个错误是,您在JS数组上调用remove,而不是在observable数组上调用remove。 以下是工作代码:

$(document).ready(
  function () {

    var Crime = function (CaseNumber, DateOfIncident, Description) {
        this.CaseNumber = CaseNumber;
        this.DateOfIncident = DateOfIncident;
        this.Description = Description;
    }

    var crimes = function (items) {
        var self = this;
        //Data
        self.items = ko.observableArray(items)

        //operations
        window.addCrime = function () {
            if ($("#AddCrimeForm")) {
                crime = new Crime($("#CaseNumber").val(), $("#DateOfIncident").val(), $("#Description").val());
                //var JSONObj = { CaseNumber: $("#CaseNumber").val(), DateOfIncident: $("#DateOfIncident").val(), Description: $("#Description").val() };
                self.items.push(this.crime);

                $("#CaseNumber").val("");
                $("#DateOfIncident").val("");
                $("#Description").val("");
            }
        }

        self.removeCrime = function (item) {
            self.items.remove(item);
        }
    }

    var initialData = new Array();
    ko.applyBindings(new crimes(initialData), $("#CrimeList")[0])
    }
);

我检查了你的代码,据我说你错过了击倒的真正力量。如果您使用的是knockout,那么我认为没有必要使用jquery选择器访问输入字段的值

我已经创建了一个js小提琴,请检查:

javascript代码将类似于:

function crimeRecord(data)
{
   var self = this;

   self.caseNumber =  data.CaseNumber;
   self.dateOfIncident = data.DateOfIncident;
   self.description = data.Description;
}

//Main view model
function viewModel()
{
   var self = this;

   self.crimeRecords = ko.observableArray();

   self.newCrimeRecord = ko.observable(new crimeRecord({}));

   self.addRecord = function(){
     self.crimeRecords.push(self.newCrimeRecord());
     self.newCrimeRecord(new crimeRecord({}));
   };

   self.removeRecord = function(record){
     self.crimeRecords.remove(record);
   };
}

$(function(){
  ko.applyBindings(new viewModel());
});
编辑-1

正如您在关于jquery验证的评论中提到的疑问,不需要重写任何验证逻辑,您可以将jquery验证用于此viewmodel。以下是使用它的一种方法:

   .... 

   self.addRecord = function(){
     if($("form").valid())
     {   
       self.crimeRecords.push(self.newCrimeRecord());
       self.newCrimeRecord(new crimeRecord({}));
     }
     else
      $("form").showErrors();
   };

   ...

或者你可以使用

谢谢你。我会检查一下,然后再给你回复。自从我在JS中做了任何事情后,我的JS已经生锈了好几年了,所以我很感谢你的建议。另一个错误是你在JS数组上调用remove,而不是在observable数组上。我同意。在设置viewModel时尝试使用new关键字。这将创建新对象并将其设置为。如果要在敲除之外调用add方法,还应该将其附加到窗口。来自CSharp的背景,我在JavaScript的上下文和范围方面遇到了困难。如果你能推荐这方面的好阅读材料,我将不胜感激;应该是有帮助的:谢谢。我会看一看,然后再回复您我很感谢您对Knockout的正确用法的评论,但是,我不确定这对于新记录字段上应该进行的不引人注目的JQuery验证会有什么影响。只有在验证新记录字段后,才能将记录添加到列表中。重写验证目前不是一个选项。另外,我不明白的是,为什么需要创建newCrimeRecord属性,该属性仅在创建记录时临时使用?我知道它消除了使用JQuery访问输入字段值的需要。但对我来说,这似乎有点像黑客——并不真正符合面向对象的意图。也许可以澄清这一点,或者链接到解释这一点的资源?newCrimeRecord属性只是用来保存将要添加到列表中的新记录对象,现在,如果您想在使用新创建的对象之前或之后执行任何操作,例如验证或其他操作,而不是简单地使用手头的单个属性。我觉得这里面没有黑客。我很感谢你的反馈。