Как создать угловое приложение с несколькими моделями и выбрать поля

То, что я пытаюсь создать, - это SPA, содержащий несколько вариантов выбора на одной странице, где каждый выбор имеет свою собственную модель. Выбор различных параметров в полях выбора может отображать/скрывать другие поля на странице и изменять данные для других вариантов выбора (загружать разные наборы). Наконец, параметры в двух вариантах выбора могут изменить URL-адрес (поэтому, когда страница загружается с правильным адресом, эти два параметра будут предварительно выбраны). Теперь мне интересно, что будет лучшим подходом здесь.

Первый. Стоит ли в этом случае переходить на ui-router?

Второй. Мне нужно написать пользовательскую директиву для этого выбора, которая будет иметь следующую функциональность

  1. сбор данных о загрузке
  2. отображать данные и запоминать выбор
  3. перезагрузить сбор данных, когда другой выбор вызвал его
  4. перезагрузить данные для других вариантов

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

Как я могу связать разные данные с моей директивой? Должна ли это быть просто одна массивная сложная директива или разделить ее на более мелкие части (например, одна директива для отображения закрытого окна выбора, а другая — для отображения списка и т. д.)? Как я могу вызвать событие, когда данные должны быть изменены, и прослушать подобное событие из другого выбора. Через контроллер?

Заранее спасибо за вашу помощь.


person sasklacz    schedule 23.09.2014    source источник
comment
Зачем вам нужна директива для выбора? Может быть, я что-то упускаю, но ваша модель может управлять всем поведением, тем более что логика очень специфична для приложения.   -  person New Dev    schedule 24.09.2014
comment
Потому что это не простой выбор, а вместо этого после нажатия кнопки, похожей на выбор, пользователю предоставляется панель с вкладками с несколькими параметрами на каждой панели. Хотя, возможно, я слишком усложняю. Можете ли вы уточнить, что «модель может управлять всем поведением»?   -  person sasklacz    schedule 24.09.2014
comment
Ах, если выбор больше похож на настраиваемый элемент управления, тогда это имеет смысл.   -  person New Dev    schedule 24.09.2014


Ответы (1)


Что я могу предложить, так это сохранить MVC. Вот одно из решений -

  1. Создайте контроллер для хранения данных модели (здесь $scope.selectOptions внутри контроллера)
  2. Передайте эти значения экземпляру «выбрать директиву» для отображения
  3. Всякий раз, когда пользователь выбирает значение в директиве, передает это выбранное значение контроллеру (допустим, в контроллере $scope.selectedValue хранится это значение)
  4. В контроллере добавьте $watch к $scope.selectedValue и в своем обратном вызове вызовите другой набор данных для другого варианта выбора. (скажем, сохранение этого набора данных в $scope.anotherSelectOption )
  5. Передайте этот $scope.anotherSelectOption экземпляру «2-й директивы»
  6. Всякий раз, когда пользователь выбирает значение во 2-й директиве, передает это выбранное значение контроллеру (допустим, в контроллере $scope.anotherSelectedValue хранится это значение)
  7. В контроллере добавьте $watch к $scope.anotherSelectedValue и в обратном вызове измените URL-адрес того, что вы хотите сделать.

Вот как будет выглядеть ваш HTML -

<div ng-controller="MyCtrl">
    <select-directive selection-option="selectOptions", selected-option="selectedValue"> </select-directive>
    <select-directive selection-option="anotherSelectOptions", selected-option="anotherSelectedValue"> </select-directive>
</div>

Вот ваш контроллер, он будет выглядеть примерно так -

yourApp.controller('MyCtrl', function($scope) {

    $scope.selectOptions = []; // add init objects for select 
    $scope.selectedValue = null;

    $scope.$watch('selectedValue', function() {
        // here load new values for $scope.anotherSelectOptions
        $scope.anotherSelectOptions = [] // add init objects for select 
        $scope.anotherSelectedValue = null;
    });

    $scope.$watch('anotherSelectedValue', function() {
        // here add code for change URL
    });

});

Вот ваша директивная область

yourApp.directive('selectDirective', function() {
    return {
        templateUrl: 'views/directives/select.html',
        restrict: 'E',
        scope: {
            selectionOption: '=',
            selectedOption: '='
        }
    };
});
person Rohan Chandane    schedule 24.09.2014
comment
Будет ли это работать так же, если бы я переместил контроллер в свойство «controller» директивы вместо использования ng-controller? - person sasklacz; 24.09.2014
comment
Если вы переместите этот контроллер внутрь директивы, то область действия вашего контроллера будет ограничена директивой. Однако здесь вам нужно связаться с другим экземпляром select. Если вы сделаете это и каким-то образом сможете передать выбранное значение другому экземпляру директивы, тогда это будет тесно связанный компонент, это не очень хороший дизайн. - person Rohan Chandane; 24.09.2014