在Backbone中共享相同功能的最佳方式

时间:2012-07-24 07:59:07

标签: javascript backbone.js mixins

我处于当前状态:对于Backbone.Collection(但也应该是Backbone.Model),我以这种方式扩展课程(1)。
我想分享的功能如下:
1)startPollingstopPolling应该是可从所有Backbone.Collections访问的公共方法,最终是Backbone.Models
2)executePollingonFetch应该是私有方法。

在所有startPolling保留stopPollingBackbone.Collection/Backbone.Model隐私方法之间分享executePollingonFetch的最佳方法是什么?

我的想法是创建一个新文件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
};

3 个答案:

答案 0 :(得分:1)

您可以扩展Collection原型,将公共方法添加到您拥有的每个集合中(如果您每个地方都需要它)。在其他情况下,您可以使用此方法创建自己的构造函数(第一种方法)。

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

对于provate方法的情况,你可以这样做,只需启动它们是带下划线的名称:

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

这种命名方法表明这是一种私有方法。

如果你想在模型中使用它们,你可以扩展Model原型或创建模型的新构造函数,就像在例子upper中一样。如果这个函数是相同的(希望不是),你可以给一个函数的链接,而不是它自己的函数。

var bar = function() {};

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

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

因此,当您更改条形函数时,它将在模型和集合中更改。

答案 1 :(得分:1)

对于私有方法,据我所知,我没有回忆javascript,它提供了一种在对象'private'中创建属性的方法。我能想到的唯一方法就是让“私人”方法只能在它们使用的方法中使用。

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);

一个工作小提琴示例here

希望这有帮助!

答案 2 :(得分: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;
});