現在、backbone.js 0.5.3とバックボーンローカルストレージアダプタ1、underscore.js 1.2.2およびjquery mobile 1.0.1を使用しているWebアプリケーションがあります。 バックボーンとアンダースコアのバージョンをアップグレードしたいと思っていましたが、私のバージョンのアンダースコア(1.2.2から1.3.1)をアップグレードすると、backbone.jsにエラーが発生しました。アンダースコアをアップグレードし、アンダースコアとbackbone.jsを両方ともアップグレードしようとしましたが、まだエラーが発生します。私はアンダースコアの変更履歴に大きな変化は見られませんが、何かが足りなくなっているかもしれません。underscore.jsをアップグレードするとbackbone.jsが破損する
backbone.jsで取得しているjavascriptエラーの詳細は次のとおりです。エラーメッセージは「this.modelはコンストラクタではありません」、または「Uncaught TypeError:undefined is not a function」です。 。このエラーは、コード内のフェッチ呼び出しに基づいてトリガーされるaddメソッドによって呼び出されるbackbone.collectionの_prepareModelメソッドでスローされます。これは、サーバーではなくローカルストレージから取得されます。私が見ることができるのは、 "モデル"は定義されていない(私はそれが関数であると思われる)メソッド内で、それがエラーを投げている理由です。
ここで私はちょうどコレクションにフェッチ呼んでいるので、私は本当に、私は投稿できるように私自身のコードの多くを持っていない_prepareModel方法
_prepareModel: function(model, options) {
if (!(model instanceof Backbone.Model)) {
var attrs = model;
options.collection = this;
model = new this.model(attrs, options);
if (!model._validate(model.attributes, options)) model = false;
} else if (!model.collection) {
model.collection = this;
}
return model;
},
のコードです。
おかげ
EDIT
は、ここで私が話している問題を再現するいくつかのコードです。私がunderscore.jsバージョン1.2.2を使用すると、正常に動作します。もし1.3.1でスワップすればエラーになります。
var YM = YM || {};
YM.Holidays = YM.Holidays || {};
YM.Holidays = {
Holiday: Backbone.Model.extend({
fDate: null,
Description: null,
}),
HolidayView: Backbone.View.extend({
tagName: 'li',
holidayTemplate: null,
initialize: function() {
this.holidayTemplate = _.template($('#holiday-template').html());
},
render: function() {
$(this.el).html(this.holidayTemplate(this.model.toJSON()));
return this;
},
}),
Holidays: Backbone.Collection.extend({
model: YM.Holidays.Holiday
}),
HolidayListView: Backbone.View.extend({
el: 'body',
initialize: function() {
this.collection = YM.holidays;
},
render: function() {
var $holidayList = $('#ulHolidays');
_.each(this.collection.models, function (holiday) {
var view = new YM.Holidays.HolidayView({ model: holiday});
$holidayList.append(view.render().el);
}, this);
}
})
};
$(function() {
var holidays = [ {fDate: '1/1/2012', Description: 'New Years'}
, {fDate: '1/16/2012', Description: 'ML King Day'}
, {fDate: '2/20/2012', Description: 'Presidents Day'}];
YM.holidays = new YM.Holidays.Holidays();
YM.holidayListView = new YM.Holidays.HolidayListView();
YM.holidays.add(holidays);
YM.holidayListView.render();
});
EDIT 2
それは少しの見知らぬ人を取得し、問題は何とかjqueryの携帯電話に関連しているように、私はもう少しそれに探しに計画しているようです。その間、ここでは2つのjsfiddlesがあります。それらの間の唯一の違いは、使用するアンダースコアのバージョンです。
http://jsfiddle.net/KDMcd/ - 1.2.2が http://jsfiddle.net/hnGAA/ -underscore 1.3.1は、私のテスト例で動作し、私はそれを試してみるつもりです
EDIT 3
おかげで、動作しない動作します下線私の実際のプロジェクトではあとでモデルを明示的に設定する必要がある理由はありますか?私がやっていたやり方は、ドキュメンテーションに基づいてやるべき方法だと思われます。また、アンダースコアで何が変わったのか、これは今必要ですか?
OKおかげで、私は明示的に代わり
Holidays: Backbone.Collection.extend({
model: YM.Holidays.Holiday
}),
私はこれをやっているのinitializeメソッドにバックボーンのコレクションのモデルを設定してやってしまったものをryanmarcの答えに基づいて、問題を解決することができました
Holidays: Backbone.Collection.extend({
inititlaize: function()
{
this.model = YM.Holidays.Holiday;
}
}),
別の奇妙なことがJQMページとは対照的に、私は無地のdivでリストをレンダリングしていますように、私はHTMLを切り替えた場合、それはまた、(それをそのエラーをスローしません同じコードやライブラリを使用しています何らかの理由でリストを2回レンダリングしますが、私は本当にそれをやろうとしていません。私は理由を調べていません)。例えば 代わりに次のマークアップ
<div data-role="page" id="Holidays">
<div data-role="header">
<h1>Holidays</h1>
</div>
<div data-role="content">
<ul data-role="listview" data-inset="true" id="ulHolidays">
</ul>
</div>
<div data-role="footer">
<h3>Footer</h3>
</div>
</div>
の私は(それが二回レンダリングしても、それはおそらく関連ありません)私はエラーを取得しない
<div>
<ul data-role="listview" data-inset="true" id="ulHolidays"></ul>
</div>
までこのマークを使用している場合。誰もがここで何が起こっているかについてのアイデアや洞察力を持っていますか?
- 私は何の問題もなく、あまりにも、それらを使用しています。これらのライブラリを使用しているコードを投稿してください。私はかなり間違いがあると確信しています。 – acme
正直言って私のコードを正確に調べる場所はわかりません。エラーの原因となる行は 'YM.holidays.fetch'(またはそれを代用するコレクション)を呼び出すだけです。私はエラーを再現し、それを引き起こす可能性のあるものを絞り込むための新しいプロジェクトを作成しようとします。 – Jack
コレクションのモデル( 'model = new this.model(...)'の 'this.model')がモデル"クラス "であることを確認しましたか? –