AngularJS Несколько представлений с общей схемой проектирования логики

0

Я использую ui-router, и мой макет разделен на 2 ui-views, side-bar и основной контент

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

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

Мне не нравится ни одно из этих решений, я буду рад получить ваши дизайнерские предложения

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

$stateProvider.state('home', {
                url: "/home",
                views: {
                    main: {               
                        templateUrl:"homeTemplate.html",
                        controller: "HomeController"
                    },
                    sidebar: {templateUrl: "homeSidebarTemplate.html"}
                }
            })
Теги:
angular-ui-router

1 ответ

1
Лучший ответ

Взгляните на угловые службы

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

Например:

angular.module('myApp.someNamespace', [])
  .factory('someService', function () {

  var service = {};
  service.myList = {1,2,3};
  service.myMenu = {'apples', 'oranges', 'pears'}

  service.addToList = function(number) {
   service.myList.push(number);
  }
  return service;
});

вставляйте эту службу в свой контроллер и директиву боковой панели:

angular.module('myApp.myControllers', [])
    .controller('myCtrl', function ($scope, someService) {

    $scope.model = someService;
});

В вашем представлении привязывайтесь к вашим служебным переменным/методам:

<div ng-repeat="number in model.myList">
   <input type="number" ng-model="number"/>
</div>
<input type="number" ng-model="newNumber"/>
<button ng-click="model.addToList(newNumber)">Add</button>

Еще одно преимущество использования этого шаблона заключается в том, что ваши взгляды будут оставаться там, где вы были, когда будете двигаться вперед и назад (более сдержанно), потому что он получает данные из вашего сервиса singleton. Также вам нужно будет только один раз получить данные из своего api (пока вы не обновите свой браузер).

  • 0
    Я знаю сервисы, думал об использовании сервиса, в который оба контроллера попадают для обмена данными, но в качестве дизайна он будет восприниматься как проблема, так как потребует дублирования и децентрализованной логики.
  • 0
    Что вы имеете в виду именно под дубликатом и децентрализованным? Назовите свои услуги соответствующим образом, и у вас есть обратное. Многоразовая логика централизована.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню