2012-07-24 51 views
0

我目前处于这种情况:对于Backbone.Collection(但它也应该是Backbone.Model),我以这种方式扩展类(1)。
我想分享的功能如下:
1)startPollingstopPolling应该从所有Backbone.Collections访问的公共方法,并最终Backbone.Models
2)executePollingonFetch应该是私有的方法。在Backbone中共享相同功能的最佳方式

什么是共享所有Backbone.Collection/Backbone.Model保持executePollingonFetch私有方法之间startPollingstopPolling的最佳方式?

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

回答

1

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

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

因此,当您将更改栏功能时,它将在模型和集合中进行更改。

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

的工作拨弄例如here

希望这有助于!

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; 
}); 
相关问题