Правильная настройка маршрутизаторов для отношений Родитель потомок в backbone Marionette

StackOverflow https://stackoverflow.com/questions/9399602

  •  29-10-2019
  •  | 
  •  

Вопрос

Пытаюсь создать страницу, которая позволяет пользователям добавлять, редактировать и просматривать родительские дочерние элементы вместе взятые.

Пользовательский интерфейс состоит из 3 столбцов Родительский :Список родителей и детей :Ребенок

Я хочу настроить контроллеры так, чтобы пользователи могли вернуться туда, где они были, но не вижу необходимости в этом, чтобы и родительский, и дочерний элементы были доступны для редактирования.

// Приближаемся с помощью backbone marionette, но все еще испытываем некоторые небольшие проблемы

    MyRouter = Backbone.Marionette.AppRouter.extend({
        appRoutes: {
            '': 'AddClient',
            'View/:clientid': 'ViewClient',
            'Edit/:clientid': 'EditClient',
            'View/:clientid/Add': 'PolicyAdd',
            'View/:clientid/View/:policyid': 'PolicyView',
            'View/:clientid/Edit/:policyid': 'PolicyEdit'
        }
    });

    someController = {
        AddClient: function () {
            var someView = new ClientAdd();
            MyApp.clientPane.show(someView);
        },
        ViewClient: function (clientid) {
            var someView = new ClientView();
            MyApp.clientPane.show(someView);
        },
        EditClient: function (clientid) {
            var someView = new ClientEdit();
            MyApp.clientPane.show(someView);
        },
        PolicyAdd: function (clientid) {
            this.ViewClient(clientid);
            var someView = new PolicyAdd();
            MyApp.policyPane.show(someView);
        },
        PolicyView: function (clientid, policyid) {
            this.ViewClient(clientid);
            var someView = new PolicyView();
            MyApp.policyPane.show(someView);
        },
        PolicyEdit: function (clientid, policyid) {
            this.ViewClient(clientid);
            var someView = new PolicyEdit();
            MyApp.policyPane.show(someView);
        }
    };

Наличие "this.ViewClient" кажется халтурным и к тому же не работает.

Это было полезно?

Решение

Ответ, состоящий из нескольких частей, здесь...

"this.ViewClient не является функцией"

это ошибка в Marionette.метод контроллера вызывается в контексте маршрутизатора, а не контроллера, поэтому вызов this.ViewClient пытается найти его на маршрутизаторе.

упс.

ошибка зарегистрирована.исправлю как можно скорее. https://github.com/derickbailey/backbone.marionette/issues/38

--

Обновить:теперь эта ошибка исправлена в версии 0,5.1 Backbone.Marionette https://github.com/derickbailey/backbone.marionette

--

чтобы обойти эту проблему на данный момент, вы можете сделать это:

PolicyEdit: {
  someController.ViewClient();
  // ...
}

Если это не сработает, возможно, вам придется использовать Underscore.js ' bind или bindAll методы обеспечения правильной привязки к функциям вашего контроллера.

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

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

Прямой ответ на этот вопрос - нет.

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

Маршрутизаторы И Контроллеры

Маршрутизатор - это функция, а не архитектурное требование.Ваше приложение должно работать без маршрутизатора, а маршрутизатор должен только добавлять возможность использования закладок и кнопки браузера вперед / назад.

Учитывая эту философию (которая, я знаю, противоречива), использование контроллера, подобного вашему, и вызов нескольких методов на вашем контроллере, чтобы перевести ваше приложение в правильное состояние, является одним из правильных подходов.

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

Надеюсь, это поможет.:)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top