我处于当前状态:对于Backbone.Collection
(但也应该是Backbone.Model
),我以这种方式扩展课程(1)。
我想分享的功能如下:
1)startPolling
和stopPolling
应该是可从所有Backbone.Collections访问的公共方法,最终是Backbone.Models
2)executePolling
和onFetch
应该是私有方法。
在所有startPolling
保留stopPolling
和Backbone.Collection/Backbone.Model
隐私方法之间分享executePolling
和onFetch
的最佳方法是什么?
我的想法是创建一个新文件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
};
答案 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;
});