Я пытаюсь найти правильный способ объявления модели для Backbone Collection в CoffeeScript. Позвольте мне продемонстрировать на примере:
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