我意识到这个问题有很多解决方案,但我想知道社区的意见是什么。
我有一系列模型和收藏品。每个模型都有许多 View ,如详细信息、编辑、打印、旁白、帮助等。集合的 View 通常具有相同的名称(即:旁白、帮助等)。
我的一个要求是我需要在模块中构建我的代码。如果未加载模块,应用程序不应跟踪该模块的功能。例如,如果用户无权查看、编辑其他用户等,则可能会发生这种情况。因此“Users”模块甚至不会被加载。
所以...
我认为存储模型的 View 定义的好地方可能是模型的构造函数,而对于集合的构造函数来说,存储 View 定义的好地方可能是这样。例如:
var User = (function(){ // module definition
// model definition
var Model = Backbone.Model.extend({
initialize: function() {
// ...
}
},{
Views: {
Details: Backbone.View.extend({
// ...
}),
Aside: Backbone.View.extend({
// ...
}),
Help: Backbone.View.extend({
// ...
})
}
});
// collection definition
var Collection = Backbone.Collection.extend({
model: Model,
initialize: function() {
// ...
}
},{
Views: {
Aside: Backbone.View.extend({
// ...
}),
Help: Backbone.View.extend({
// ...
})
}
});
// add more code here
return { // make model and collection public
Model: Model,
Collection: Collection
};
})(); // end module definition
我意识到我可以在其他地方表达我的观点,但这种方法是否会有我可能没有意识到的重大缺点?也许是内存泄漏或者其他不太明显的事情?
谢谢!
最佳答案
我认为您最好不要将 View 作为“类方法”添加到模型和集合中。由于JavaScript 原型(prototype)继承的性质,您实际上并没有添加类方法,而是为模型类型添加构造函数的属性。至于这是否会导致内存泄漏等问题,我不能说。
我想说的是,除非您有未列出的令人信服的理由来使用此结构,您最好将您的 View 分组到简单的对象。
如果目标是模块化您的代码,我会利用类似 require.js 的东西或Marionette modules或者只是将“相关”代码分组到 IIFE 中。
如果您有兴趣了解更多关于传入 Backbone.Model.extend
方法的 classProperties
到底发生了什么的信息,那么我建议直接查看annotated source .
关于javascript - 在模型或集合构造函数中存储特定于模型或集合的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13711580/