やあみんな、
このサイトに投稿するのはこれが初めてであり、これから提起しようとしている問題は、そこに到達するために必要な一連の変数のために明確にするのが困難です。私が使用しているフレームワークについて簡単に説明します。
jQuery、jQuery-ui、Backboneを使用してChrome拡張機能を構築しています
拡張機能のJSスイート全体はCoffeeScriptで記述されており、Railsとアセットパイプラインを利用してすべてを管理しています。これは、拡張コードをデプロイするときにrake assets:precompile
、結果の圧縮されたJSを実行して拡張ディレクトリにコピーすることを意味します。
このアプローチの良いところは、ライブラリを含めることで、Railsアプリ内から拡張jsを実際に実行できることです。これは基本的に、jsをコンテンツスクリプトとして挿入する私の拡張機能background.jsファイルと同じです。
とにかく、私が最近遭遇した問題は、私の仲間のサイトwhiskeynotes.comで自分の拡張機能をテストしようとしたときでした。
私が気付いたのは、私のバックボーンモデルがそれぞれのコレクションに追加されたときに壊れていたということです。だから何かのような
this.collection.add(new SomeModel)
私のモデルのナンセンスバージョンを作成しました。
このコードは最終的にBackboneのprepareModelコードにぶつかります
_prepareModel: function(model, options) {
options || (options = {});
if (!(model instanceof 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;
},
さて、私が拡張機能をテストしたほとんどのサイトでは、結果は正常ですが、私の仲間のサイト!(model instance Model)
では、実際には正しいクラスのインスタンスであるにもかかわらず、評価はtrueと評価されます。その結果、モデルの属性がモデルコレクションへの参照であるモデルの非常に混乱したバージョンになります(奇妙なことですか?)。言うまでもなく、その後、あらゆる種類のクレイジーなことが起こっていました。
なぜこれが起こっているのかは私を超えています。ただし、この行(!(model instanceof Model))
をに変更(!(model instanceof Backbone.Model))
すると、問題が解決するようです。Flotライブラリ(jQueryグラフライブラリ)が独自のバージョンの「モデル」を作成することと関係があるのではないかと思いましたが、ソースを調べてもそのインスタンスは見つかりませんでした。なぜこれが起こるのか知りたいだけです。そして、この小さな変更をバックボーンソースに追加することは理にかなっていますか?
アップデート:
「修正」が実際には機能しないことに気づきました。また、バックボーンモデルがラッピングオブジェクトで名前空間化されているため、宣言は次のようになります。class SomeNamespace.SomeModel extends Backbone.Model