0

私は現在の状況にいます:(Backbone.Collectionしかし、それはまたあるべきですBackbone.Model)、私はこの方法でクラスを拡張します(1)。
私が共有したい機能は次のとおりです:
1)すべての Backbone.Collections から、最終的には Backbone.Models からアクセスできるパブリック メソッドにする必要がありますstartPolling2 )プライベート メソッドにする必要があります。stopPolling
executePollingonFetch

すべての保管 方法と非公開方法startPollingの間で共有するための最良の方法は何ですか?stopPollingBackbone.Collection/Backbone.ModelexecutePollingonFetch

私の考えは、新しいファイルを作成することですutils/backbone.polling.js(2)。それは良い解決策ですか?


(1)

define([
    'backbone',
    'models/myModel'
], function (Backbone, MyModel) {
    'use strict';

    var MyCollection = Backbone.Collection.extend({

        model: MyModel,

        url: 'some_url'

        initialize : function () {
            _.bindAll(this);
        },

        startPolling: function () {
            this.polling = true;
            this.minutes = 2;
            this.executePolling();
        },

        stopPolling: function () {
            this.polling = false;
        },

        executePolling: function () { 
            this.fetch({success : this.onFetch});
        },

        onFetch: function () {
            if (this.polling) {
                setTimeout(this.executePolling, 1000 * 60 * this.minutes);
            }
        }
    });

});

(2)

utils/backbone.polling.js

Backbone.Collections.startPolling = function () {
    // code here
};

Backbone.Collections.stopPolling = function () {
    // code here
};
4

3 に答える 3

1

@Flops と @jakee の非常にエレガントなアプローチにもかかわらず、非常に単純なものは、次のような純粋な JS utils ライブラリを持つことができます。

// code simplified and no tested
App = {};
App.Utils = {};
App.Utils.startPolling: function () {
  this.polling = true;
  this.minutes = 2;
  this.executePolling();
},

var MyCollection = Backbone.Collection.extend({
  startPolling: App.Utils.startPolling;
});
于 2012-07-24T08:59:43.337 に答える
1

Collection プロトタイプを拡張して、所有しているすべてのコレクションにパブリック メソッドを追加できます (本当に必要な場合)。それ以外の場合は、このメソッドを使用して独自のコンストラクターを作成できます (最初の方法)。

_.extend(Backbone.Collection.prototype, {
    startPolling: function() {},
    stopPolling: function() {}
});

証明メソッドの場合は、アンダースコア付きの名前から始めるだけで同じことができます。

_.extend(Backbone.Collection.prototype, {
    _executePolling: function() {},
    _onFetch: function() {}
});    

このメソッドの命名方法は、これがプライベート メソッドであることを示しています。

モデルでそれらが必要な場合は、モデル プロトタイプを拡張するか、上の例のようにモデルの新しいコンストラクター関数を作成できます。この関数が同じである場合 (そうでないことを願っています)、関数自体ではなく、関数へのリンクを提供できます。

var bar = function() {};

_.extend(Backbone.Model.prototype, {
   foo: bar
});

_.extend(Backbone.Collection.prototype, {
   foo: bar
});

したがって、バー機能を変更すると、モデルとコレクションで変更されます。

于 2012-07-24T08:48:26.247 に答える
1

プライベート メソッドについては、私の知る限り、オブジェクト内の属性を「プライベート」にする方法を提供する JavaScript を思い出すことはありません。私が考えることができる唯一の方法は、「プライベート」メソッドを、それらが使用されているメソッド内からのみ利用できるようにすることです.

startPolling: function () {
  this.polling = true;
  this.minutes = 2;

  var self = this;
  var executePolling = function() {
    // Do something
  };

  var onFetch = function() {
    // Do something
  }; 

  executePolling();
},

ただし、この方法では、関数内の関数からオブジェクトの属性に動的にアクセスすることはできません (作成時に状態から値を保存するだけです) (この現象を示すフィドルへのリンク)。最新のオブジェクト属性値にアクセスしたい場合は、関数を公開する必要があります。良い慣例は、プライベートであることを示すために先頭にアンダースコアを付けて「プライベート」関数に名前を付けるだけだと思います(この_executePollingとのように_onFetch)。

共有する最良の方法について。見栄えの良いソリューションは、次のようなものです。

 var WestCoastCustoms= {
   // Declare your stuff here
 };

 var Collection = Backbone.Collection.extend(WestCoastCustoms);
 var Model = Backbone.Model.extend(WestCoastCustoms);

実際のフィドルの例はこちら

うまくいけば、これは役に立ちました!

于 2012-07-24T08:49:03.670 に答える