Объявление коллекции Backbone в CoffeeScript - PullRequest
2 голосов
/ 28 августа 2011

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

Ответы [ 3 ]

3 голосов
/ 28 августа 2011

Я не могу повторить вашу ошибку.Вот мой код:

class Like extends Backbone.Model

class Likes extends Backbone.Collection
    model: Like

likes = new Likes
like = new likes.model
console.log like instanceof Like  # true

Возможно ли, что вы где-то сделали опечатку?В частности, MyApp.Models.Like определен в точке, где вы пишете model: MyApp.Models.Like?Тесты

console.log MyApp.Collections.Likes::model?

и

console.log MyApp.Collections.Likes::model is MyApp.Models.Like

должны дать вам true.И если они это сделают, то new likes.model должно быть эквивалентно new MyApp.Models.Like.

0 голосов
/ 15 ноября 2012

Эй, я знаю, что опоздал на эту вечеринку, но я хотел добавить, что каждый раз, когда я видел эту проблему, это происходит потому, что программисты забывают, что классы в coffeescript - это утечка абстракций, и что их объявления не читаются раньшевыполнение - в этом случае Модель должна быть определена за до скомпилированной js пытается добавить ее в прототип Коллекции.

0 голосов
/ 28 августа 2011

Что вы ожидаете, когда напишите

like = likes.model.new

? Этот синтаксис работает в Ruby, но в CoffeeScript он просто присваивает свойству new likes.model значение like. В этом случае это будет просто undefined. Попробуйте

like = new likes.model

вместо.

...