2014-11-24 3 views
1

Мне любопытно, существует ли подходящий способ, с помощью которого нужно обрабатывать/реализовывать привязку данных между двумя вложенными контроллерами. Позвольте мне объяснить сценарий.Двустороннее связывание данных между двумя вложенными контроллерами Angular.js

У меня есть formController, в котором есть элементы формы. Одним из элементов формы является мультиселективный виджет, для которого я создал частичный html, который я могу использовать в других местах, и этот частичный запуск с отдельным контроллером позволяет называть его multiSelectController (обратите внимание: этот контроллер/частичный/вид вложен в form/formController).

То, что я хочу, - иметь формуController (которая имеет данные), передавать в список «выбранных» элементов, например [1, 3, 7, 10], в частичный мультиспектр, который будет затем сможете визуализировать выбранные элементы. И в то же время, когда элемент отменяется или выбирается из частичной частичной части, я хочу, чтобы иметь возможность передавать новый выбранный список в formController/scope (так что я могу отобразить высказывание 1, 3, 5 теперь выбрано).

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

ответ

1

Лучший способ согласно мне:

  1. Создать сервис, который будет содержать все переменные модели.

    angular.service("dataService", function() { 
    
        this.value1 = ""; 
        this.value2 = ""; 
    }); 
    
  2. ссылка, что сервис в ваших контроллерах, сохраняя их ссылку в области.

    angular.controller("myCntrl1", function($scope, dataService) { 
        $scope.dataService = dataService; 
    }); 
    
    
    angular.controller("myCntrl2", function($scope, dataService) { 
        $scope.dataService = dataService; 
    }); 
    
  3. Теперь в вашем HTML, вы ссылаетесь все модальные переменные, используя ссылку на службу:

    // Controller 1 view 
        <div ng-controller="myCntrl1"> 
         <input type="text" ng-model="dataService.value1" /> 
        </div> 
    
        // Controller 2 view 
        <div ng-controller="myCntrl2"> 
         The value entered by user is {{dataService.value1}} 
        </div> 
    
+0

Это не то, что я хочу. Использование сервисов отлично, но для моего сценария это плохая идея (в противном случае я получу 100 услуг для очень простого случая). – decay

+0

Как вы можете получить сотню услуг @decay ?? Почему вы не можете использовать одну или пару сервисов для хранения всего, что вам нужно для сохранения? –

1

Поскольку formController является родительский контроллер, вам не нужно беспокоиться о доступе к своей модели/varaibales, просто добавьте $ parent в сферу охвата ребенка для доступа к любому родительскому свойству

$scope.$parent.someProperty 

Итак, если yo u измените или обновите эту переменную, она также автоматически обновится в области родителя.

+0

знал об этом, и это правильно, но не уверены, правильно ли это. Был поиск большего количества способов «передать» дочернему представлению/контроллеру набор входных значений/объектов, которые он может редактировать, сохраняя привязку в 2 направлениях. Можно легко достичь этого с помощью директивы, передав атрибуты, но разве нет способа сделать это без новой директивы (и передавать конкретные объекты вместо дочернего вызова и искать родительские объекты)? – decay

+0

@decay: В этом подходе нет ничего плохого. См., В любом случае вам нужно изменить объект/переменную, которая находится в области родителя с помощью дочернего контроллера. Вы также можете сделать это напрямую, используя $ scope дочернего контроллера, и он будет искать эту переменную в прототипной цепочке и получить доступ к ней. $ scope. $ parent быстрее! И вы можете изменять только определенные родительские объекты. Он не будет влиять на другие объекты области родителя. – RahulB

+0

@decay: Также этот подход важен, поскольку вам необходимо поддерживать двухстороннюю привязку, и это может быть достигнуто только путем обновления объекта в области родителя. Локальное обновление переменной не будет отображаться в области родителя. – RahulB

Смежные вопросы