【问题标题】:Error: a url property or function must be specified错误:必须指定 url 属性或函数
【发布时间】:2012-04-22 00:54:12
【问题描述】:

这是我在 BackBone.js 上工作的最初几天。我实际上被路由器部分卡住了,因为我在控制台中收到错误“错误:必须指定 url 属性或函数”。这是我的场景;我有一个动态形成 REST URL 的点击函数,并相应地从服务器获取数据。

这里是点击功能代码

function onUserClick(obj){
     var userID=$(obj).attr('id');
     window.location.href="#"+userID+"/";
     var userRouter = new UserRouter;
}

我在路由器中有以下代码

var userModel;
var UserRouter = Backbone.Router.extend({
    routes:{
        ":userid/":"getUsers"
    },
    getUsers:function(userid){
        var url="http://myserver.com/users/"+userid;
        userModel = new UserModel({urlRoot:url});
        var userView = new UserView({el:$(#"container")});
    }
});
var UserModel = Backbobe.Model.extend({});
var UserView = Backbone.View.extend({
    model:userModel,
    initialize:function(){
        _.templateSettings = {
            interpolate: /\{\{\=(.+?)\}\}/g,
            evaluate: /\{\{(.+?)\}\}/g
        };
        this.model.fetch();
        this.model.bind("change",this.render,this);
    },
    render:function(){
        var data=this.model.toJSON();
        var userTemplate=_.template($("#userTemplate").text());
        var htmlData=userTemplate({
            "userData":data
        });
        $(this.el).html(htmlData);
    }
});

有人可以帮我解决这里的问题吗?我知道我在这里做错了什么,并就此寻求专家建议。非常感谢此场景的工作示例。

【问题讨论】:

  • 你能给你的错误一些上下文吗?您尝试过什么来解决这个问题?

标签: backbone.js underscore.js backbone-routing backbone-model


【解决方案1】:

你在你的模型上调用fetch:

var UserView = Backbone.View.extend({
    model: userModel,
    initialize: function() {
        // ...
        this.model.fetch();

但是你没有给你的模型一个url属性:

var UserModel = Backbone.Model.extend({});

fetch 方法与服务器通信,它使用url 来这样做:

网址 model.url()

返回模型资源在服务器上的相对 URL。如果您的模型位于其他地方,请使用正确的逻辑覆盖此方法。生成以下形式的 URL:"/[collection.url]/[id]",如果模型不是集合的一部分,则回退到 "/[urlRoot]/id"。

default implementation for a Model's url 看起来像这样:

url: function() {
  var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError();
  if (this.isNew()) return base;
  return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id);
},

您没有urlRoot,没有将 URL 生成委托给的集合,并且您没有覆盖 url,因此调用了 urlError(),这就是您的错误消息的来源.

您的UserModel 需要一个RESTful url 属性或函数,以便您可以从服务器fetch 实例。或者,您可以使用客户端环境中已有的数据创建模型(当然,只要您不打算通过 Backbone 保存任何内容)。

【讨论】:

  • 感谢您的回答,很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多