【发布时间】:2011-08-27 20:02:30
【问题描述】:
我正在尝试找出在 CoffeeScript 中为 Backbone 集合声明模型的正确方法。让我用一个例子来演示:
class MyApp.Collections.Likes extends Backbone.Collection
constructor: (@models, @options) ->
model: MyApp.Models.Like
当我初始化这个集合并创建一个新模型时,它失败了。
likes = new MyApp.Collections.Likes
like = new likes.model // same result for likes.model.new
TypeError: Result of expression 'likes.model' [undefined] is not an object.
查看编译后的JavaScript,模型定义如下:
MyApp.Collections.Likes = (function() {
__extends(Likes, Backbone.Collection);
function Likes(models, options) {
this.models = models;
this.options = options;
}
Likes.prototype.model = MyApp.Models.Like; // <--
return Likes;
})();
我可以通过两种可行的方式定义模型:
解决方案 1
class MyApp.Collections.Likes extends Backbone.Collection
constructor: (@models, @options) ->
model: -> MyApp.Models.Like // Notice the ->
编译成:
MyApp.Collections.Likes = (function() {
__extends(Likes, Backbone.Collection);
function Likes(models, options) {
this.models = models;
this.options = options;
}
Likes.prototype.model = function() { // <-- added to the prototype as a function
return MyApp.Models.Like;
}
return Likes;
})();
解决方案 2
class MyApp.Collections.Likes extends Backbone.Collection
constructor: (@models, @options) ->
@model: MyApp.Models.Like // Notice the @
编译成:
MyApp.Collections.Likes = (function() {
__extends(Likes, Backbone.Collection);
function Likes(models, options) {
this.models = models;
this.options = options;
}
Likes.model = function() { // <-- not added to prototype
return MyApp.Models.Like;
}
return Likes;
})();
我很确定 解决方案 1 是更好的解决方案。然而,我看过的很多网站的教程都没有使用-> 或@ 来定义它。
我是不是做错了什么?
Like 模型没有任何问题,它非常普通:
class MyApp.Models.Like extends Backbone.Model
【问题讨论】:
标签: javascript backbone.js coffeescript