0

我目前的情况:对于 a Backbone.Collection(但也应该是 a Backbone.Model),我以这种方式扩展类(1)。
我想分享的功能如下:
1)startPolling并且stopPolling应该是可从所有 Backbone.Collections 以及最终 Backbone.Models 访问的公共方法
2)executePolling并且onFetch应该是私有方法。

在所有保留 和私有方法之间共享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() {}
});

对于 provate 方法,您可以执行相同的操作,只需开始它们是带有下划线的名称:

_.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();
},

但是这样你就不会从函数中的函数动态访问对象属性(它们只是在创建它们时保存状态中的值)(链接到fiddle展示这种现象)。如果您想访问最新的对象属性值,那么您必须公开这些函数。我认为一个好的约定就是用一个前导下划线来命名“私有”函数,以表示它们是私有的(比如这个_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 回答