0

私は test.html に以下を持っています:

<script>
var Foo = Backbone.Model.extend({
  initialize: function(options) {
    console.log('hello!');
  }
});
var Bar = Backbone.Collection.extend({
  model: Foo
});
var m = new Bar({});
</script>

結局のところ、変数mが初期化さinitializeれると、Foo の関数が呼び出されます。したがって、Firebug コンソールでは、'hello!' が表示されます。行をコメントアウトすると:

model: Foo,

「こんにちは!」はありません。コンソール出力で。したがって、コレクションのモデルを宣言すると、そのモデルのinitialize関数が呼び出されます。この行動は少しばかげていると思います。バックボーン コードを読んでいませんが、これには理由がありますか?

4

3 に答える 3

3

コードの動作に問題はありません。
コレクション定義でモデルを渡すときは、そのコレクション内のすべてのモデルが type になるように指定しますFoo
コレクションを初期化するときは、コレクションnew Bar({})にモデルを渡します(ただし、@alexanderbが述べたように、コレクションは最初の引数として配列を期待していると思います)、それを初期化して出力し'hello!'ます。
たとえば、コレクション コンストラクターにモデルを渡さない場合:

new Bar();// no console output

コンソール出力はありません。一方、オブジェクトの配列を渡す場合、コレクションは提供されたすべてのモデルを初期化します。

new Bar([{},[},{}]);// will output 'hello!' 3 times
于 2012-07-26T07:03:44.643 に答える
1

コレクションのコンストラクターはモデルの配列を期待していると思います。したがって、あなたがすべきことは次のとおりです。

var collection = new Bar( [ {} ] );

そこで、モデルの初期化メソッドを呼び出す必要があります。

于 2012-07-26T07:05:56.623 に答える
0

ここで少し調べたところ、Backbone.Collection関数は次のようになりました。

var Collection = Backbone.Collection = function(models, options) {
  options || (options = {});
  if (options.model) this.model = options.model;
  if (options.comparator !== void 0) this.comparator = options.comparator;
  this._reset();
  this.initialize.apply(this, arguments);
  if (models) this.reset(models, {silent: true, parse: options.parse});
};

したがって、このようにコレクションの初期化メソッドを作成すると、

initialize: function() {
  console.log('hello collection!');   
}

helloコレクションがモデルからのhelloの前にログに記録されていることに気付くでしょう。したがって、モデルの初期化は、 -callのreset後の関数から行う必要があります。コレクションにモデルが渡されない限り呼び出されません。一見しただけでは実行されていないように見えますが、実際にはinitializerest

var m = new Bar({});

バックボーンは{}をモデルとして解釈し、関数で初期化しresetます。しかし{}、あなたが言うモデルではありませんか?ええと、Backboneはそれについてあまりうるさくはありません。モデル属性を含めることができる、または含めることができないハッシュの配列が必要なだけです。reset-functionは最終的に-functionにつながり、add最終的にすべての道路はローマに行き_prepareModelます。

_prepareModel: function(attrs, options) {
  if (attrs instanceof Model) {
    if (!attrs.collection) attrs.collection = this;
    return attrs;
  }
  options || (options = {});
  options.collection = this;
  var model = new this.model(attrs, options);
  if (!model._validate(model.attributes, options)) return false;
  return model;
}

ここで何が起こるかというと、コレクションはモデルまたは属性のハッシュが渡されたかどうかをチェックし、属性のハッシュの場合は、定義されたモデルに基づいて新しいモデルを作成し、そのハッシュを渡します。

これが問題を解決するだけでなく、そこで起こったことにいくつかの追加の光を当てることを願っています。そしてもちろん、私はすべての人がバックボーンのソースコード、つまりドキュメントの最悪のOGを読むことを心から宣伝しています。

于 2012-07-26T07:33:19.123 に答える