17

モデルにカスタムコンストラクターを作成するためのいくつかの例を探しています。モデル/データの構造を別の方法で設定し、それを属性として設定するだけです。

誰かがこれを行う方法のいくつかの基本的な例を教えてもらえますか?

ありがとう!

4

6 に答える 6

39

本当にコンストラクタをオーバーライドしたい場合は、次のようにconstructorプロパティをに渡しますBackbone.Model.extend()

var Klass = Backbone.Model.extend( {

  constructor : function ( attributes, options ) {

    // ...

  }

} );

カスタム コンストラクターから組み込みコンストラクターを呼び出したい場合は、次のようにすることができます。

var Klass = Backbone.Model.extend( {

  constructor : function ( attributes, options ) {

    Backbone.Model.apply( this, arguments );

  }

} );

または、親クラスを含む変数の名前をサブクラス全体で繰り返す必要がない場合、またはその変数の値が変化することを心配したくない場合は、次のようなことができます。

var Klass;

var parent_klass = Backbone.Model.prototype;

( function ( parent_klass ) {

  Klass = parent_klass.constructor.extend( {

    constructor : function ( attributes, options ) {

      parent_klass.constructor.apply( this, arguments );

    }

  } );

} )( parent_klass );

または、@Claude が提案する方法を好むが、親クラスの変数名の代わりにサブクラス内でサブクラス変数名を繰り返す場合:

var Klass = Backbone.Model.extend(

  {

    constructor : function ( attributes, options ) {

      Klass.parent_klass.constructor.apply( this, arguments );

    }

  },

  {

    parent_klass : Backbone.Model.prototype

  }

);

それ以上のアドバイスが必要な場合は、達成したいことをより具体的にする必要があります。

ビルトイン コンストラクター機能の後に実行したいことはすべて、おそらく で実行する必要がありますinitialize()

于 2012-05-02T12:02:41.677 に答える
7

コメントで述べたように、this.constructor.__super__(または) を使用するときは注意してください。( Chrome で)this.__super__無限ループに陥らないようにしてください。Maximum call stack size exceeded

コンソールで次のことを試してください(自己責任で、前述の無限ループにつながります)

var A = Backbone.Model.extend({constructor: function () {
  console.log("log: A");
  this.constructor.__super__.constructor.apply(this, arguments);
}});

var B = A.extend({constructor: function () {
  console.log("log: B");
  this.constructor.__super__.constructor.apply(this, arguments);
}});

new A();
//  log: A
//  > Backbone.model.extend.constructor
new B();
//  log: B
//  (8192) log: A
//  > RangeError: Maximum call stack size exceeded

その理由は、 を作成するときにBthisのコンストラクターでAのインスタンスを指すBためthis.constructor.__super__.constructor、 のコンストラクターを指し続けA、何度も何度も呼び出されるためです。

「意図した動作」が必要な場合は、次の構文のいずれかを使用します。

var A = Backbone.Model.extend({constructor: function () {
  console.log("log: A");
  A.__super__.constructor.apply(this, arguments);
}});

var B = A.extend({constructor: function () {
  console.log("log: B");
  B.__super__.constructor.apply(this, arguments);
}});

new A();
//  log: A
//  > Backbone.model.extend.constructor
new B();
//  log: B
//  log: A
//  > A.extend.constructor

または直接なしで__super__

var A = Backbone.Model.extend({constructor: function () {
  console.log("log: A");
  Backbone.Model.apply(this, arguments);
}});

var B = A.extend({constructor: function () {
  console.log("log: B");
  A.apply(this, arguments);
}});

new A();
//  log: A
//  > Backbone.model.extend.constructor
new B();
//  log: B
//  log: A
//  > A.extend.constructor
于 2012-09-10T07:25:25.480 に答える
6

これは、デフォルトのBackbone.Modelコンストラクターをオーバーライドする方法です。

Backbone.Model = (function(Model) {
  // Define the new constructor
  Backbone.Model = function(attributes, options) {
    // Your constructor logic here
    // ...
    // Call the default constructor if you wish
    Model.apply(this, arguments);
    // Add some callbacks
    this.on('event', this.myCallback, this);
  };
  // Clone static properties
  _.extend(Backbone.Model, Model);      
  // Clone prototype
  Backbone.Model.prototype = (function(Prototype) {
    Prototype.prototype = Model.prototype;
    return new Prototype;
  })(function() {});
  // Update constructor in prototype
  Backbone.Model.prototype.constructor = Backbone.Model;
  return Backbone.Model;
})(Backbone.Model);

その後、Backbone.Collectionプロトタイプが更新されたBackbone.Modelコンストラクターを使用していることを確認する必要があります。

_.extend(Backbone.Collection.prototype, {
  model: Backbone.Model
});

私の意見では、このアプローチの「利点」は、モデルコンストラクターとしてBackbone.Modelを引き続き使用できることです。これにより、変更がより透過的になります。

于 2012-05-11T07:42:11.093 に答える
2

自分でモデルを書きたい場合は、次のようにします。

var YourModel = function () {
    // your constructor here
};

_.extend(YourModel.prototype, Backbone.Model.prototype, {
    // your model method here
});

Backbone.Model注意してください。コンストラクターのソースコードを参照する必要があると思います。しかし、これは良い考えではないと思います。オーバーライドinitializeメソッドは正しい方法です。

var YourModel = Backbone.Model.extend({
    initialize: function (attrs, options) {
        Backbone.Model.prototype.initialize.apply(this, arguments); // call super constructor

        // your constructor code here
    }
});
于 2012-05-01T14:54:06.707 に答える
0

initializeメソッドを探しているようです。新しいモデルを作成するときに呼び出され、必要な場合に if を使用できます。

var myModel = Backbone.Model.extend({
  initialize: function() {
    // do something besides setting attributes or model
    alert('myModel is ready for action!');
  }
});

new myModel();

constructorもっと複雑なことをしたい場合は、Backbone コアのメソッドをオーバーライドできます。ただし、それははるかにトリッキーなビジネスです。可能であれば、公開されたメソッドを使用する方がはるかに優れています!

于 2012-05-01T14:49:23.560 に答える
-1

Backbone.Model コンストラクターをオーバーライドするときに注意すべき点 - 呼び出さないとBackbone.Model.apply、Model.cid が設定されない可能性があります。

それは悪いことです - cid が複数のモデルにまたがって設定されていない場合、コレクションはそれをコレクション内の最初のモデルの複製と見なす可能性があり、追加を許可しません。

于 2014-05-30T17:41:01.533 に答える