Вопрос по – Как получить доступ к вычисляемому полю модели магистрали из шаблона руля?

13

Я хотел бы получить доступ к вычисленным полям, которые я реализовал в модели (backbone.js) из шаблона. Нужно ли мне всегда определять помощника, чтобы сделать это?

Я думаю, что проблема связана с тем, как я передаю модель в шаблон. Если я передаю this.model.toJSON (), я получаю доступ к свойствам, но не к функциям, которые я определил в нем. Если я передаю this.model напрямую, я могу получить доступ к функции, но не к свойствам базовой модели.

Я думаю, что проблема связана с тем, как я передаю модель в шаблон. Juanma

Ваш Ответ

4   ответа
17

this.model.toJSON() к вашим шаблонам.

То, что вам нужно сделать, чтобы получить рассчитанные значения, это переопределить вашtoJSON Метод по вашей модели.


MyModel = Backbone.Model.extend({

  myValue: function(){
    return "this is a calculated value";
  },

  toJSON: function(){
    // get the standard json for the object
    var json = Backbone.Model.prototype.toJSON.apply(this, arguments);

    // get the calculated value
    json.myValue = this.myValue();

    // send it all back
    return json;
  }

})

И теперь у вас есть доступ кmyValue из JSON, который возвращаетсяtoJSONЭто означает, что у вас есть доступ к нему в представлении.

Другой вариант, как вы упомянули, заключается в создании вспомогательных методов и их регистрации в Handlebars. Если у вас нет какой-либо функциональности, которая меняется в зависимости от того, как шаблон отображается и / или какие данные передаются в шаблон, я бы не стал беспокоиться об этом.

Error: User Rate Limit Exceeded Juanma
Error: User Rate Limit ExceededtoJSON: Backbone.syncError: User Rate Limit ExceededtoJSONError: User Rate Limit ExceededsyncError: User Rate Limit ExceededJSON.stringifyError: User Rate Limit ExceededtoJSONError: User Rate Limit ExceededmyValueError: User Rate Limit Exceeded
-1

function initialize() {
    this.set("calculatedColumn", function () { return this.otherColumn; });
}

Базовая модель обычно хранит фактические значения данных внутри в «model.attributes». Вот почему, когда вы передаете вашу модель непосредственно в шаблон, в нее входят только функции, добавленные непосредственно в модель, а не какие-либо данные. И если вы используете model.toJSON (), он обычно реализуется в backbone как _.clone (model.attributes) (см. Backbone.js). Таким образом, у вас есть данные, а не функции, добавленные непосредственно в модель. Вот почему вышесказанное работает - вы устанавливаете функцию на model.attributes, а не на сам объект модели. Не используйте ссылки на model.attributes напрямую, используйте model.get (& quot ;вычисленный столбец & quot;) и модель.set (& quot ;вычисленный столбец & quot ;, ...).

Таким образом, model.get (& quot ;вычисленный столбец & quot;) возвращает функцию. Если вы идете {{вычитанный столбец}} в руле (при условии, что вы используете руль), он показывает значение, возвращаемое функцией. Но selectedColumn не будет отправлено на сервер, потому что backbone синхронизирует JSON.stringify с model.toJSON (в backbone.js), а JSON.stringify игнорирует функции. Если вы хотите, чтобы JSON.stringify не игнорировал функцию (поэтому функция превращается в значение данных при каждом запуске toJSON в модели - во время визуализации представления и синхронизации модели), переопределите model.toJSON, как описано @Derick Bailey.

Кроме того, вы можете получить свою собственную BaseModel из Backbone.Model и переопределить .toJSON и извлечь все ваши модели из BaseModel, если вам нужно. Тогда вам понадобится общая версия .toJSON, которую можно применить к любой модели.

0

@DerickBailey прав, что переопределение toJSON делает свою работу. Но он также проникает в связь с сервером (см. Комментарий muu к его ответу).

Итак, в конце концов, я создал плагин Backbone, специально предназначенный для экспорта данных в шаблоны, и сделал это с минимальными усилиями:Backbone.Marionette.Export, Он также имеет дело с вложенными структурами, заботится о циклических ссылках и т. Д.документы.

Вот как это работает. Включите файл плагина в ваш проект и объявите

MyModel = Backbone.Model.extend({

  foo: function () {
      return "I am a calculated value";
  },

  exportable: "foo"    // <-- this is the one line you have to add

});

Если вы являетесь пользователем Marionette, вы уже сделали это.foo отображается в ваших шаблонах, как если бы это был атрибут модели.

В простых представлениях Backbone, просто позвонитеmyModel.export() или жеmyCollection.export() вместо их аналогов toJSON при рендеринге.

Для методов, принимающих аргументы, существуетonExport обработчик. Примеры, опять же, вдокументы.

4

initialize: function() {
        this.on("change", function () {
            this.set({ calculatedColumn: this.get("otherColumn") }, { silent: true });
        });
    },

Вычисляемые свойства в Магистрали

Похожие вопросы