Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.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 BackboneJS未捕获错误:A";url";必须指定属性或函数_Javascript_Jquery_Backbone.js_Asp.net Web Api - Fatal编程技术网

Javascript BackboneJS未捕获错误:A";url";必须指定属性或函数

Javascript BackboneJS未捕获错误:A";url";必须指定属性或函数,javascript,jquery,backbone.js,asp.net-web-api,Javascript,Jquery,Backbone.js,Asp.net Web Api,我得到了这个错误。我能够使用BackboneJs预执行读取和删除函数,但在执行add方法时出现错误,希望您能提供帮助。 JSfiddel路径是 模型 模型集 var contactCollection = Backbone.Collection.extend({ model: modelContact, url: function() { return 'api/Contact'; }, add: function(model) {

我得到了这个错误。我能够使用BackboneJs预执行读取和删除函数,但在执行add方法时出现错误,希望您能提供帮助。 JSfiddel路径是

模型

模型集

var contactCollection = Backbone.Collection.extend({
    model: modelContact,
    url: function() {
        return 'api/Contact';
    },
    add: function(model) {
        this.sync("create", model); // Error On create
    },
    remove: function(model) {
        this.sync("delete", model); //Runs Fine
    }
});
var contacts = new contactCollection;
看法

主视图

var main = Backbone.View.extend({
    el: $("#contactApp"), 
    events: {
        "click #btnsave": "CreateNewContact"
    },
    initialize: function() {
        this.Nameinput = this.$("#contactname");
        this.Addressinput = this.$("#contactaddress");

        contacts.on("add", this.AddContact, this);
        contacts.on("reset", this.AddContacts, this);
        contacts.fetch();
    },
    AddContact: function (contact) {
        console.log("AddContact");
        var view = new contactView({ model: contact });
        this.$("#tblcontact tbody").append(view.render().el);
    },
    AddContacts: function () {
        console.log("AddContacts");
        contacts.each(this.AddContact);
    },
    CreateNewContact: function (e) {
        console.log(e);
        //Generate an error "BackboneJS Uncaught Error: A "url" property or function must be specified"
        contacts.add({ Name: this.Nameinput.val(), Address: this.Addressinput.val() });
    }
});
var m = new main;

}))

Sync方法尝试使用CRUD功能同步到服务器设置以处理它。如果这不是您想要的,并且您只想在客户端显示此信息,而不是使用sync,那么您应该使用Collection.add(model)和Collection.remove(model)

您的JSFIDLE缺少主干引用和所有引用

工作更新:

更简单的代码(无需定义集合上的
add
remove
方法!)。还有更常见的Javascript编码风格约定

请注意,我必须手动生成一个“Id”属性,以允许创建多个联系人。默认情况下,当您将Id设置为0时,不会添加具有相同Id的第二个模型,因为主干网看到Id为0的模型已在集合中

要保存时,请调用
model.save()
方法。不要手动调用sync,通常不需要

对于要在添加到集合之前保存到数据库的模型,请使用:

createNewContact: function (e) {
  e.preventDefault();
  var self = this;
  var newContact = new ContactModel({                   
    Name: this.$("#name").val(),
    Address: this.$("#address").val()
  });
  newContact.save({ success: function(model){
    self.collection.add(model);
  });

  //clear form
  this.$("#name").val("");
  this.$("#address").val("");

}

您正在用“添加”、“删除”等覆盖标准主干.集合方法,这可能会导致意外行为。最好给函数名赋予一些含义,或者直接使用标准名称。如果您想保存联系人并将其添加到集合中,请调用model.save()并将其添加到
success
处理程序中的集合中…注意,但我的removes方法工作正常,我也已覆盖了它。而您的remove工作正常,因为您没有访问覆盖的remove方法,它超出了范围,您引用的是我刚才提到的您应该使用的常规删除。同样,sync方法仅用于与RESTful服务器接口,如果该服务器不能正确处理请求,它将抛出url错误。它被称为fine,并响应Post/Delete/PUT请求。我应该如何调用被覆盖的remove或任何其他选项实际上,很抱歉,您的remove可能被正确调用了,我刚刚打开了您的JSFIDLE并注意到您将所有Javascript代码放在一起。如果要将集合和视图分离为两个单独的文件,则需要一个全局名称空间。那么哪一个不起作用,添加还是删除,因为在您的描述中,您说删除不起作用,但在代码的注释中,它说添加不起作用。哪一行代码导致了错误?已更新。关于文件分离。我可以做到这一点,但由于我是backbonejs新手,因此专注于当前代码会很好/节省时间。但是谢谢你的建议。
var contactView = Backbone.View.extend({
    tagName: "tr",
    events: {
        "click a.destroy": "clear"
    },
    template: _.template($("#newContacttemplate").html()),
    initialize: function() {
        this.model.on("change", this.render, this);
        this.model.on('destroy', this.remove, this);
    },
    render: function() {
        this.$el.html(this.template(this.model.toJSON()));
        return this;
    },
    clear: function(e) {
        contacts.remove(this.model); // runs fine
    }
});
var main = Backbone.View.extend({
    el: $("#contactApp"), 
    events: {
        "click #btnsave": "CreateNewContact"
    },
    initialize: function() {
        this.Nameinput = this.$("#contactname");
        this.Addressinput = this.$("#contactaddress");

        contacts.on("add", this.AddContact, this);
        contacts.on("reset", this.AddContacts, this);
        contacts.fetch();
    },
    AddContact: function (contact) {
        console.log("AddContact");
        var view = new contactView({ model: contact });
        this.$("#tblcontact tbody").append(view.render().el);
    },
    AddContacts: function () {
        console.log("AddContacts");
        contacts.each(this.AddContact);
    },
    CreateNewContact: function (e) {
        console.log(e);
        //Generate an error "BackboneJS Uncaught Error: A "url" property or function must be specified"
        contacts.add({ Name: this.Nameinput.val(), Address: this.Addressinput.val() });
    }
});
var m = new main;
createNewContact: function (e) {
  e.preventDefault();
  var self = this;
  var newContact = new ContactModel({                   
    Name: this.$("#name").val(),
    Address: this.$("#address").val()
  });
  newContact.save({ success: function(model){
    self.collection.add(model);
  });

  //clear form
  this.$("#name").val("");
  this.$("#address").val("");