Как предотвратить локальную функцию действия Flow-Router, перезаписывающую элемент, определенный группой

У меня есть определения группы Flow-Router, похожие на:

var myRouteGroup = FlowRouter.group({
  name: "myGroupName",
  prefix: "/myPrefix",
  // Using arbitrary element to pass group wide defaults
  defaultGroupSettings: {item1: "value1", item2: "value2"};
});

Затем я определяю маршрут в этой группе:

myRouteGroup.route("/home",{
  name: "myRoute",
  triggersEnter: [ /*...*/ ],

  action: function () {
    // Get the arbitrary settings object from group definition
    var settings = this.group.options.defaultGroupSettings;
    // Override one of the settings element's value
    settings.item1 = "new value";
    // Render the route, and pass the modified settings
    BlazeLayout.render("layoutTemplate", settings);
  }

});

Проблема, которую я пытаюсь решить. Приведенный выше код перезаписывает defaultGroupSettings.item1 для всех последующих маршрутов, присоединенных к группе после вызова этого маршрута. Это как если бы локальное переопределение либо перезаписывало объект настроек группы, либо объект настроек группы не вызывался бы снова, если последующие маршруты находятся в той же группе.

Это проблема с областью данных? Или проблема в том, что Flow-Router больше не обращается к определению группы, если вызываемый новый маршрут является частью той же группы, а просто использует существующий предыдущий объект группы маршрутов? Или, может быть, что-то, о чем я не подумал.


person robertdavid    schedule 24.06.2016    source источник


Ответы (1)


Проблема более явно понята:

Маршрутизатор потока отображает элемент «группа» объекта маршрутизатора и использует этот объект (кажется) при ссылке на параметры группы, а не ссылается или повторно запускает определение группы маршрутов.

Это означает, что все последующие маршруты, которые вызываются, но имеют одну и ту же группу, похоже, просто наследуют ранее визуализированный групповой объект от предыдущего маршрута. В соответствии с его нереактивным подходом.

Способ, который я разработал, чтобы справиться с этим, состоял в том, чтобы добавить triggersExit: [resetDefaults] к определению группы. Теперь любой маршрут, вызываемый в группе, будет сбрасывать значения маршрута по умолчанию между вызовами маршрутов, добавив функцию:

По сути, если вы измените какие-либо базовые «маршруты по умолчанию», как это делаем мы, в локальной функции route.action, поскольку Flow-Router не является реактивным, объект группы маршрутизаторов, по-видимому, сохраняется от маршрута к маршруту, пока маршруты в той же группе. Также этот объект «options» передается маршрутизатору из определения маршрута. Это означает, что если вы переопределяете параметр по умолчанию в приведенном выше случае, он будет перезаписан для всех последующих маршрутов, использующих ту же группу, после вызова маршрута, который его переопределяет.

Решение, которое я придумал, состояло в том, чтобы выполнить функцию сброса значений по умолчанию следующим образом: triggersExit: [ resetDefaults ] в определении группы.

Тогда просто сделайте сброс настроек по умолчанию. Причина, по которой я сделал это при выходе, заключается в том, что следующий вызываемый маршрут может по-прежнему локально переопределять эти значения по умолчанию:

function resetDefaults (context) {
  context.route.group.options.groupDefaultValue = "myVal";
};

Я думаю, это должно работать очень хорошо, и вы можете проверить обсуждение эволюции этой функциональности.

person robertdavid    schedule 24.06.2016