HotTowel Durandal Внедрение различных представлений в зависимости от пользователя

В шаблоне shell.html для HotTowel у нас есть:

    <!--ko compose: {model: router.activeItem, 
        afterCompose: router.afterCompose, 
        transition: 'entrance'} -->
    <!--/ko-->

который автоматически вставит правильный вид по соглашению. Я пытаюсь внедрить разные представления в зависимости от роли пользователя в приложении HotTowel/Durandal. Например, у меня есть два представления,

  1. productEditor_Admin.html
  2. productEditor_Superviser.html (вместо этих двух представлений у меня раньше был только productEditor.html, условно все работало)

и только одна ViewModel:

  1. productEditor.js

Теперь я хочу иметь функцию в productEditor.js, которая позволит мне решать, какое представление вставлять в зависимости от роли пользователя. В документации по композиции я вижу, что мы можем сделать function strategy(settings) : promise, но я не уверен, как лучше всего это сделать это в шаблоне HotTowel. Кто-нибудь уже пробовал и получил ответ на этот вопрос?


person aminjam    schedule 09.05.2013    source источник


Ответы (2)


Можно вернуть свойство viewUrl в модели представления, поэтому, надеюсь, что-то вроде следующего откроет дверь ;-).

define(function () {
    viewUrl = function () {
        var role = 'role2'; //Hardcoded for demo

        var roleViewMap = {
            'default': 'samples/viewComposition/dFiddle/index.html',
            role1: 'samples/viewComposition/dFiddle/role1.html',
            role2: 'samples/viewComposition/dFiddle/role2.html'
        };

        return roleViewMap[role];

    }

    return {
        viewUrl: viewUrl(),
        propertyOne: 'This is a databound property from the root context.',
        propertyTwo: 'This property demonstrates that binding contexts flow through composed views.'
    };
});
person RainerAtSpirit    schedule 10.05.2013
comment
ДА! Создатели Durandal сделали нечто потрясающее! Я не знал, что «viewUrl» на самом деле используется по соглашению, чтобы вернуть правильное представление на дисплее. Это идеально. Я все еще задаюсь вопросом о function strategy(settings):promise. Я надеюсь найти больше примеров того, как люди его использовали, но это идеально подходит для того, что я искал. Спасибо @Rainer. - person aminjam; 10.05.2013
comment
Пока ничего для стратегии (настроек): обещания..., но есть вторая альтернатива статическому свойству viewUrl. getView() разрешает просмотры для изменения vm при обновлении ko.observable. Вот ссылка на демонстрацию: spiritag.github .io/dFiddle-1.2-Q-and-A/#/view-composition/ - person RainerAtSpirit; 11.05.2013

Вы смотрели курс JumpStart Джона Папы на PluralSight.

Посмотрите исходный код этого приложения здесь: https://github.com/johnpapa/PluralsightSpaJumpStartFinal.

В файле App/Config.js он добавляет другие маршруты, которые по умолчанию видны как:

 var routes = [{
        url: 'sessions',
        moduleId: 'viewmodels/sessions',
        name: 'Sessions',
        visible: true,
        caption: 'Sessions',
        settings: { caption: '<i class="icon-book"></i> Sessions' }
        }, {
        url: 'speakers',
        moduleId: 'viewmodels/speakers',
        name: 'Speakers',
        caption: 'Speakers',
        visible: true,
        settings: { caption: '<i class="icon-user"></i> Speakers' }
        }, {
        url: 'sessiondetail/:id',
        moduleId: 'viewmodels/sessiondetail',
        name: 'Edit Session',
        caption: 'Edit Session',
        visible: false
    }, {
        url: 'sessionadd',
        moduleId: 'viewmodels/sessionadd',
        name: 'Add Session',
        visible: false,
        caption: 'Add Session',
        settings: { admin: true, caption: '<i class="icon-plus"></i> Add Session' }
    }];

Вы можете добавить маршруты к обоим представлениям здесь, используя одну и ту же логику, а затем в вашем productEditor.js вы можете решить, какое представление для навигации и перехода к нему с помощью метода router.navigateTo().

person Yogesh    schedule 09.05.2013
comment
Да, я не хочу добавлять два представления в Config.js. Должен быть более простой способ внедрения правильного представления с помощью простого вызова функции в Durandal. Нет необходимости добавлять дополнительную конфигурацию, иначе, если бы я ввел больше ролей (следовательно, больше представлений), мне пришлось бы каждый раз дублировать записи конфигурации. Рут не меняется, он один и тот же, просто виды разные в зависимости от ролей. - person aminjam; 10.05.2013
comment
Я бы лично использовал функции скрытия и отображения css, чтобы отключить части моей HTML-страницы в зависимости от ролей пользователей. Итак, если в зависимости от ролей пользователя некоторые части или компоненты страницы видны, а другие скрыты, я буду использовать нокаутные привязки, чтобы скрыть или показать их. Таким образом, мне придется поддерживать только одно представление. Однако вы хотите использовать одну и ту же модель представления и иметь разные представления в зависимости от роли пользователя? Есть ли причина, по которой вы хотите сделать это, а не скрывать и показывать части своей страницы? - person Yogesh; 10.05.2013
comment
да, это верно для простых вещей, таких как великий проект Джона Папы. но когда вы пишете полноценное бизнес-приложение, есть много логики, которой не следует делиться со всеми из соображений безопасности, поэтому только потому, что она скрыта, контент все еще доступен. Поэтому мне нужен правильный способ введения режима ограниченного редактирования для ролей, которые не проверены или не разрешены. - person aminjam; 10.05.2013
comment
Разве вы не можете использовать файлы cshtml вместо обычного html? Внутри CSHTML вы можете иметь блокировку if else таким образом, только ограниченный контент будет отображаться для клиента, и о ваших проблемах с безопасностью позаботятся. - person Yogesh; 10.05.2013
comment
Durandal был разработан с учетом мобильности и возможности перехода на PhoneGap со структурой папок, и мне нравится такой подход, поэтому я стараюсь держаться подальше от cshtml. Вот [ссылка] (hhttp://bit.ly/ZLVrHj), объясняющая это подробнее. Я знаю, что есть простой и чистый способ приблизиться к этому, но я еще не открыл эту дверь. - person aminjam; 10.05.2013