У меня есть SPA, написанный в AngularJS. На главной странице используется атрибут ng-include для определения вида загрузки. Это устанавливается в JavaScript, когда кто-то нажимает на меню, которое содержится на главной странице. Однако я столкнулся с ситуацией, когда мне нужно загрузить другое представление, нажав кнопку в другом представлении, существенно заменив его.
Я пытаюсь понять, как это сделать и из того, что я исследовал, мне нужно использовать $ rootScope и либо вызов $ emit, либо $ broadcast в дочернем представлении, и метод $ rootScope. $ On для обнаружения этого события,
Дело в том, что это не работает. Я установил свои точки останова и прошел через код, но всегда получаю эту ошибку:
Ошибка: [ngModel: datefmt] http://errors.angularjs.org/1.5.7/ngModel/datefmt?p0=2009-07-21T00%3A00%3A00
Здесь код в моей родительской странице:
$rootScope.$on('viewChanged', function () {
var menuItem = {
template: 'customerOrders.html' // will be eventually dynamic
};
navigate(menuItem);
});
function navigate(menuItem) {
$scope.activeMenuItem = menuItem;
}
<div data-ng-include="activeMenuItem.template"></div>
В контроллере дочерней страницы:
function changeSelectedView(viewTemplate) {
$rootScope.$emit('selectedViewChanged', viewTemplate);
}
Очевидно, что я делаю что-то не так. Как я могу выполнить то, что хочу, или есть совершенно другой способ сделать это?
вы можете использовать ng-route
для работы между представлениями. проверьте https://docs.angularjs.org/api/ngRoute/provider/ $ routeProvider
ng-route
не меняет страницу. Это просто меняет взгляды на странице. Вы можете переключаться между несколькими представлениями в SPA с помощью некоторого ввода.
Прежде всего, имя события в функции $ emit и в функции $ on не совпало, поэтому я сделал это исправление.
function navigateToNewTemplate(event, viewTemplate) {
var menuItem = {
template: buildTemplateUrl(viewTemplate)
};
navigate(menuItem);
}
$rootScope.$on('selectedViewChanged', navigateToNewTemplate);
function changeSelectedView(viewTemplate) {
$rootScope.$emit('selectedViewChanged', viewTemplate);
}