Базовая модель представляет собой обычный текстовый файл. Как получить?

У меня есть файл модели, который содержит обычный текстовый файл. Например, Github Gists имеет следующую структуру URL-адресов: com/140bytes/962807/raw/dfb480a5038214d152544bddb412dfe2e8656413/LICENSE.txt.

Для этого я должен переопределить fetch/save/etc или переопределить синхронизацию модели?

var File = Backbone.Model.extend({
  path: '',
  contents: '',
  initialize: function(options) {
    this.path = options.path || '';
  },
  fetch: function() {
    // Do I override fetch/save/etc?
    $.get(this.path).done(function(contents) {this.contents = contents});
  },
  sync: function (method, model, options, error) {
    // Or do I override sync?
  }
});

person Joe Frambach    schedule 21.03.2014    source источник
comment
Вам нужно отправить документ обратно на сервер? Если нет, используйте fetch.   -  person jgillich    schedule 21.03.2014
comment
Не могли бы вы пояснить, у меня есть файл модели, который содержит обычный текстовый файл? Что вы подразумеваете под «содержит простой текстовый файл»? Вы имеете в виду, что данные для модели находятся в текстовом файле?   -  person T Nguyen    schedule 21.03.2014
comment
@TNguyen Модель File имеет содержимое атрибута, которое будет содержать содержимое обычного текстового файла. Сервер не отвечает json, он отвечает обычным текстом. Я просто хочу, чтобы модель вставляла ответ в атрибут contents, а не пыталась анализировать ответ как json.   -  person Joe Frambach    schedule 21.03.2014
comment
Ага, в таком случае, что сказал Джгиллих. Просто помните, что вам нужно установить тип данных на «текст» в параметрах .get().   -  person T Nguyen    schedule 21.03.2014


Ответы (1)


Вы можете просто немного переопределить методы parse, fetch и url:

var File = Backbone.Model.extend({
  url: function(){
    return this.get('path')
  },

  // call original Backbone.Model#fetch with `dataType` equal `text` for $.ajax
  fetch: function(options){
    options = _.extend(options || {}, {
      dataType: 'text'
    });
    this.constructor.__super__.fetch.call(this, options);
  },

  // store response in content attribute
  parse: function(response){
    return {content: response};
  }
});

В этом случае ваш код будет более идиоматичным, и вы получите все преимущества нативных методов Backbone (успешные и ошибочные обратные вызовы для извлечения, запроса и синхронизации событий, событий изменения и т. д.). Вы можете использовать его как:

var someFile = new File({
  path: 'http:/example.com/someFile.txt'
});

someFile.fetch({
  success: function(){
    console.log(someFile.get('content'); // => content of someFile.txt
  }
});
person Dmytro Yarmak    schedule 21.03.2014