Backbone.js 如何使用requirejs和主干创建多个集合实例
我正在尝试创建一些通用模块,以便它可以在多个主干.Collection上重用,但我遇到了以下问题 我已经下载了作为我的应用程序模板,所以在/app/modules中,我创建了以下jsBackbone.js 如何使用requirejs和主干创建多个集合实例,backbone.js,collections,requirejs,Backbone.js,Collections,Requirejs,我正在尝试创建一些通用模块,以便它可以在多个主干.Collection上重用,但我遇到了以下问题 我已经下载了作为我的应用程序模板,所以在/app/modules中,我创建了以下js /app/modules/collection.js(所有其他收藏的常用资料) /app/modules/users.js(从Collection.js扩展而来的用户集合) 在/app/modules/collection.js中,代码为: define([ "backbone" ], function(
- /app/modules/collection.js(所有其他收藏的常用资料)
- /app/modules/users.js(从Collection.js扩展而来的用户集合)
define([
"backbone"
],
function(Backbone) {
var collection = Backbone.Collection.extend({
pagination : { total : 0 },
parse: function( response ) {
if ( response.data ) {
self.pagination.total = response.total;
return response.data;
}
return response;
},
});
return collection;
});
define([
"backbone",
"modules/collection"
],
function(Backbone, Collection) {
var users = Collection.extend({
self: null,
initialize: function( models, options ) {
self = this;
},
getData: function() {
this.fetch({
success: function() {
console.log('ok');
},
error: function() {
console.log('error');
}
});
}
});
return users;
});
define([
"app",
"modules/users"
],
function(app, Users) {
var Router = Backbone.Router.extend({
routes: {
"": "index"
},
index: function() {
var usersA = new Users([], {
url: 'http://test.test.test./users_a.html'
});
usersA.getData();
var usersB = new Users([], {
url: 'http://dev.digbil.com/users_b.html'
});
usersB.getData();
}
});
return Router;
});
在/app/modules/users.js中,代码为:
define([
"backbone"
],
function(Backbone) {
var collection = Backbone.Collection.extend({
pagination : { total : 0 },
parse: function( response ) {
if ( response.data ) {
self.pagination.total = response.total;
return response.data;
}
return response;
},
});
return collection;
});
define([
"backbone",
"modules/collection"
],
function(Backbone, Collection) {
var users = Collection.extend({
self: null,
initialize: function( models, options ) {
self = this;
},
getData: function() {
this.fetch({
success: function() {
console.log('ok');
},
error: function() {
console.log('error');
}
});
}
});
return users;
});
define([
"app",
"modules/users"
],
function(app, Users) {
var Router = Backbone.Router.extend({
routes: {
"": "index"
},
index: function() {
var usersA = new Users([], {
url: 'http://test.test.test./users_a.html'
});
usersA.getData();
var usersB = new Users([], {
url: 'http://dev.digbil.com/users_b.html'
});
usersB.getData();
}
});
return Router;
});
在my/app/router.js中,代码为:
define([
"backbone"
],
function(Backbone) {
var collection = Backbone.Collection.extend({
pagination : { total : 0 },
parse: function( response ) {
if ( response.data ) {
self.pagination.total = response.total;
return response.data;
}
return response;
},
});
return collection;
});
define([
"backbone",
"modules/collection"
],
function(Backbone, Collection) {
var users = Collection.extend({
self: null,
initialize: function( models, options ) {
self = this;
},
getData: function() {
this.fetch({
success: function() {
console.log('ok');
},
error: function() {
console.log('error');
}
});
}
});
return users;
});
define([
"app",
"modules/users"
],
function(app, Users) {
var Router = Backbone.Router.extend({
routes: {
"": "index"
},
index: function() {
var usersA = new Users([], {
url: 'http://test.test.test./users_a.html'
});
usersA.getData();
var usersB = new Users([], {
url: 'http://dev.digbil.com/users_b.html'
});
usersB.getData();
}
});
return Router;
});
假设返回20条记录,那么在usersA.pagination.total中,它应该包含值20
假设返回50条记录,那么在usersA.pagination.total中,它应该包含值50
我的问题是usersA.pagination.total都包含值50,看起来第二个实例正在覆盖第一个实例
但是userA.models和userB.models都包含正确的数据记录,其中显示了我的usersA集合中的20个用户和我的userB集合中的50个用户
如果我单独执行它们,如:
define([
"app",
"modules/users"
],
function(app, Users) {
var Router = Backbone.Router.extend({
routes: {
"": "index"
},
index: function() {
var usersA = new Users([], {
url: 'http://test.test.test./users_a.html'
});
usersA.getData();
}
});
return Router;
});
userA.pagination.total包含正确的值20
define([
"app",
"modules/users"
],
function(app, Users) {
var Router = Backbone.Router.extend({
routes: {
"": "index"
},
index: function() {
var usersB = new Users([], {
url: 'http://dev.digbil.com/users_b.html'
});
usersB.getData();
}
});
return Router;
});
userB.pagination.total包含正确的值50
不知道我哪里做错了
[编辑]如何更改代码,使每个唯一实例具有不同的分页值 [编辑]快速模型
[编辑]似乎问题出在“解析”函数中?这是javascript对象的常见行为。在这里,您必须在每个集合中设置初始分页值
分页:{total:0}
扩展集合时,它不会创建副本,而是对分页
值的引用
我应该如何更改代码以使每个唯一实例具有不同的分页值?我实际上在您的回答中尝试了该版本,我得到了相同的结果(在users.js或collection.js中定义的分页,或在users.js和collection.js中定义的分页)。我也尝试过不预定义分页,而只在users.initalize函数中创建它,并且在为两个实例运行getData之后,第一个实例pagination.total始终是默认值0。问题类似,第一个实例的pagination.total仍然等于零。我将尝试在JSFIDDLEVEN中放置代码。如果它起作用,它可能会破坏具有可重用集合的目的。js..@forest小丑添加
this.pagination={total:0}在集合的初始化方法中的code>(最简单的解决方案)。另一个解决方案是将默认值
更改为返回默认值
集的函数。另一种解决方案是,每次更改分页时创建一个新对象:(this.pagination=uu.clone(this.pagination).total=response.total;
)。