2012-03-15 10 views
0

現在、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> 

までこのマークを使用している場合。誰もがここで何が起こっているかについてのアイデアや洞察力を持っていますか?

+0

- 私は何の問題もなく、あまりにも、それらを使用しています。これらのライブラリを使用しているコードを投稿してください。私はかなり間違いがあると確信しています。 – acme

+0

正直言って私のコードを正確に調べる場所はわかりません。エラーの原因となる行は 'YM.holidays.fetch'(またはそれを代用するコレクション)を呼び出すだけです。私はエラーを再現し、それを引き起こす可能性のあるものを絞り込むための新しいプロジェクトを作成しようとします。 – Jack

+0

コレクションのモデル( 'model = new this.model(...)'の 'this.model')がモデル"クラス "であることを確認しましたか? –

答えて

4

それがこの小さな変更で正常に動作します:私はアンダースコアまたはバックボーンの最新バージョンにバグがあるとは思わないhttp://jsfiddle.net/hnGAA/1/

+1

ありがとう、私のテストの例で動作し、私は実際のプロジェクトでそれを試みるつもりです。あとでモデルを明示的に設定する必要がある理由はありますか?私がやっていたやり方は、ドキュメンテーションに基づいてやるべき方法だと思われます。また、アンダースコアで何が変わったのか、これは今必要ですか?ありがとうございました – Jack

+0

あなたの答えに基づいて私のコードを動かすことができました。誰かが何が起こっているかについての洞察を持っているかどうか少し質問を残しておきます(私はその間にあなたに投票しました)。 – Jack

+0

私は100%確信していませんが、私はまだ問題を探しています。私は最近、私が取り組んでいるプロジェクトで同じ問題に遭遇しました。原因を突き止めることができたら、私はこれを更新します。コレクション定義内のモデルを 'Backbone.Model'に設定すると機能しますが、拡張モデルに設定した場合は機能しません。それは私がそれが延長のどこかにあると思うようにする。拡張モデルを使用した後にコレクションを検査すると、コレクションモデルが未定義として表示されます。 – ryanmarc

関連する問題