2

При работе с $ionicModal в Ionic Framework я заметил, что многие люди создают экземпляр Modal внутри контроллера и передают область управления Modal. Подобно,

$ionicModal.fromTemplateUrl("views/call_options_view.html", function ($ionicModal) { 

     $scope.menu = $ionicModal; 

    }, { 

     scope: $scope, 
     animation: "slide-in-up" 

    }); 

Делая это позволяет модальный для вызова методов в области контроллера. Есть ли способ, которым мы можем дать отдельному контроллеру Modal? Прямо сейчас, используя область управления, нет ли нарушения MVC? Контроллер имеет два вида. Предположим, что я хочу, чтобы тот же доступный модальный доступ был на другом контроллере, тогда мне пришлось бы дублировать мои функции для модального на обоих контроллерах. Предполагается, что MVC улучшает повторное использование кода. Поэтому, по сути, я хочу повторно использовать MVC, предоставляя свой модальный отдельный контроллер.

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

Любые другие предложения?

ответ

1

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

Поскольку у меня был problem, касающийся навигации по моим маршрутам, я решил использовать $ionicModal, чтобы показать вид другого состояния в модальном виде. Я придумал решение I crafted there (но я еще не реализовал его для моего рабочего контекста), который должен работать в моем случае, хотя я не очень доволен им.

Подводя итог, все мои состояния вложены под tabs; когда я нахожусь в состоянии tabs.home, я хочу прямо показать состояние tabs.settings.sub. Однако tabs.settings.sub опирается на данные, заполненные его родительским состоянием tabs.settings. Отсюда моя проблема с предоставлением объема моего текущего состояния (tabs.home) до tabs.settings.sub.

Мой модальный использует шаблон, который будет включать в себя шаблон с моей точки зрения:

<script id="templates/modal.html" type="text/ng-template"> 
    <ion-modal-view> 
    <ng-include src="templateUrl" ng-controller="controller"></ng-include> 
    </ion-modal-view> 
</script> 

Затем я могу повторно использовать мнение со стороны государства. Что касается сферы применения, я использовал $scope.new(true), чтобы изолировать его, и заселил ее с данными, необходимых моим модальным шаблоном:

var subState = $state.get ('tabs.settings.sub'); 
var subScope = $scope.$new (true); // true: isolate 
subScope.title = 'Sub'; 
subScope.templateUrl = subState.templateUrl; 
subScope.controller = function() { 
    if (subState.controller) 
    return $controller (subState.controller, {$scope:subScope}); 
    return null; 
}; 

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

$ionicModal.fromTemplateUrl ('templates/modal.html', { 
    scope: subScope 
}).then (function (modal) { 
    modal.show(); 
}); 

Основная проблема с моим решением является данными транзита до контроллера зрения, чтобы показать (в данном случае SubCtrl). Но он более сужен для моего конкретного контекста: мой модальный не знает о цепочке наследования контроллеров adn, потому что это обрабатывается маршрутизатором пользовательского интерфейса.

Я не знаю, можно ли получить доступ к состоянию, связанному с контроллером (обычный шаблон, похоже, должен использовать $state.parent, но здесь это невозможно использовать, как указано UI router wiki).

Обойти я использую здесь (это та часть, я не доволен), чтобы федеративные данные через штаты:

.state ('tabs.settings', { 
    data: { status: 'valid' } 
} 

у меня есть доступ к нему при создании моей модальности:

subScope.status = subState.data.status; 

И у меня есть доступ к нему от родительского контроллера:

$scope.status = $state.current.data.status;