2016-09-09 12 views
1

urlプロパティをメソッドに設定してBackbone Collectionクラスを持っています。バックボーンコレクションURLはパラメータを取らない

urlは私がbaseUrlusernamepathと呼ばれている3「要素」で構成されている - それは私が働いているスパで複数のユーザーに同じインスタンスを使用baseUrl/username/path

ようになります。しかし、(インスタンス化の後に)私が変更できるようにしたい要素の1つがユーザー名です。私は2つの理由からこれが必要です。

1st - 私はインスタンス化時にusernameプロパティを持っていません。

第2 - ユーザー名はユーザーによって異なるため、新規ユーザーごとにコレクションの新しいインスタンスを作成する必要はありません。

urlメソッドは、myCollection.url({username: "Mac"})のような何かを行うことができるように、コレクションをインスタンス化した後にパラメータを取得しないのはなぜですか?

またBackboneは、urlメソッドにパラメータを渡すことができないのはなぜですか?

答えて

1

バックボーンは、コレクションとしてコンテキストを持つurlメソッドを呼び出すので、コレクションインスタンスのメンバ変数にはthisでアクセスできます。

var MyCollection = Backbone.Collection.extend({ 
    url: function() { 
     return "base-url/" + this.username + "/path"; 
    }, 
}); 

インスタンス化した後、これを使用するには、手動であなたのコレクションのusernameフィールドを設定することができたり、あなたのコレクションのsyncメソッドをオーバーライドすることができます。

var MyCollection = Backbone.Collection.extend({ 
    url: function() { 
     return "base-url/" + this.username + "/path"; 
    }, 

    sync: function(method, model, options) { 
     options = options || {}; 
     if (options.username) this.username = options.username; 

     // call the default sync 
     return Backbone.collection.prototype.sync.call(this, method, model, options); 
    } 
}); 

そして、それを使用します。

myCollection.fetch({ username: "Mac" }); 

私はバックボーンのannotated sourceの熱心なユーザーだと、それはのように本当に重要です

URLが呼び出された方法を知っている方法についての追加情報は、多くのバックボーンの機能は文書化されておらず、ソースは小さくて簡単に通過できます。

あなたがsync方法を確認する場合は、その行が表示されるはずです。

params.url = _.result(model, 'url') || urlError(); 

をそして、あなたは、アンダースコアのresult機能を確認した場合、あなたはそれがこのように(文字列として渡された)関数を呼び出すことがわかります。

return _.isFunction(value) ? value.call(object) : value; 
関連する問題