10

これらは、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);
    }
});

誰かが私がここで問題を理解するのを手伝ってもらえますか?私はここで何か間違ったことをしたことを知っており、これについて専門家のアドバイスを求めています。このシナリオのウォーキングサンプルは大歓迎です。

4

1 に答える 1

23

fetchモデルを呼び出しています:

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

urlしかし、モデルにプロパティを与えていません:

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

fetchメソッドはサーバーと対話し、そのために使用しurlます。

URL model.url()

サーバー上でモデルのリソースが配置される相対 URL を返します。モデルが別の場所にある場合は、このメソッドを正しいロジックでオーバーライドしてください。フォームの URL を生成します:モデルがコレクションの一部でない場合"/[collection.url]/[id]"にフォールバックします。"/[urlRoot]/id"

モデルのデフォルトの実装は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 なプロパティまたは関数が必要です。または、クライアント側の環境で既に利用可能なデータからモデルを作成することもできます (もちろん、バックボーンを介して何かを保存する予定がない場合)。urlfetch

于 2012-04-09T18:01:49.940 に答える