【问题标题】:Backbone localstorage A "url" property or function must be specifiedBackbone localstorage 必须指定“url”属性或函数
【发布时间】:2013-05-30 22:09:39
【问题描述】:

我正在使用主干本地存储插件创建一个基于主干示例的小型应用程序。

为新模型保存数据时,我总是收到错误“必须指定“url”属性或函数

在阅读了几个类似的主题后,我仍然无法找到原因。

型号:

directory.models.EmployeeCollection = Backbone.Collection.extend({

    localStorage: new Backbone.LocalStorage("EmployeeCollection"), 

    model: directory.models.Employee,

    store: directory.utils.store,

    findByName: function(key) {
        this.reset(this.store.findByName(key));
    }

});

观点:

directory.views.newEmployeeView = Backbone.View.extend({

    tagName: "div",

    initialize: function() {
        this.template = _.template(directory.utils.templateLoader.get('new-employee'));
    },

    events: {
        "click .save": "saveEmployee"
    },

    render: function(eventName) {
        $(this.el).html(this.template(this.model.toJSON()));
        return this;
    },

    saveEmployee: function(event){
        this.model.set({
            firstName:$('#newFirstName').val(),
            lastName:$('#newLastName').val(),
            title:$('#newTitle').val(),
            city:$('#newCity').val(),
            officePhone:$('#newOfficePhone').val(),
            cellPhone:$('#newCellPhone').val(),
            email:$('#newEmail').val()
        });

        this.model.save();
        window.history.back();

        return false;
    }
});

【问题讨论】:

  • 您的视图的模型属性是否已经是您集合的成员?你能展示一下你是如何在视图上设置模型属性的吗?
  • 该模型尚未在收藏中。这是一个新的。 newEmployee: function() {this.slidePage(new directory.views.newEmployeeView({model:new directory.models.Employee()}).render());}
  • ...甚至不确定我是否必须实例化集合以及在哪里执行此操作?
  • 尝试在你的路由器中创建一个集合的实例,并将它设置在视图上,就像你当前对模型所做的那样。在您看来,您可以执行 this.collection.create({'firstName', firstName, etc. etc})。我认为该模型可能需要与您的收藏相关联,然后才能将其持久化。 create 方法会添加模型并保存。
  • 为什么我需要在 .create() 中重复整个 JSON?当我刚刚创建具有这些属性的模型时。难道没有一种简单的方法可以将模型及其所有属性添加到集合中吗?

标签: backbone.js local-storage


【解决方案1】:

我认为在尝试持久化之前,您需要新模型成为您的集合的成员。尝试创建一个集合的新实例并将其传递给视图(可能在您的路由器中),如下所示:

new newEmployeeView({ collection: new EmployeeCollection() });

在您看来,您可以使用 Backbone 的 create 便捷方法(请参阅docs)将模型的新实例添加到集合中并将其持久化:

this.collection.create({
    firstName:$('#newFirstName').val(),
    lastName:$('#newLastName').val(),
    title:$('#newTitle').val(),
    city:$('#newCity').val(),
    officePhone:$('#newOfficePhone').val(),
    cellPhone:$('#newCellPhone').val(),
    email:$('#newEmail').val()
});

【讨论】:

  • 我现在尝试了多种语法,总是从主干.localstorage.js 收到以下错误:无法读取未定义的属性“延迟”。从方法 Backbone.LocalStorage.sync
  • 这与您开始时的错误不同,因此我们可能会到达某个地方;)。您能否创建一个重新创建当前问题所需的最简单示例并将其发布到jsfiddle.net
  • 我为 jsfiddle 使用了太多的库。我将从头开始制作一个新应用程序,以更好地理解主干,而不是详细说明演示。由于我的原始问题已解决,因此我接受了您的回答。感谢您的耐心等待!
  • 感谢您的回答。我可以理解您想要从头开始的理由,但不禁认为这有点过激。我认为如果你创建了一个小提琴,它应该很容易解决你的问题。链接到外部库非常容易,我猜你需要重新创建问题是 jQuery、主干和本地存储插件。我打赌你可以在 10 分钟内完成。
  • 由于我在从头开始时遇到了同样的错误,我为此创建了一个新主题:stackoverflow.com/questions/16853612/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2014-12-11
  • 1970-01-01
相关资源
最近更新 更多