Я прошу прощения в начале за длинное объяснение, которое следует. Я считаю, что необходимо полностью объяснить, что происходит.
Я настроил свое приложение NS на использование навигации с вкладками и экрана входа в систему, выполнив запись здесь . Общая структура приложения идентична структуре приложения в git репо здесь .
Вместо игроков и команд в git репо у меня есть 3 вкладки : Панель инструментов, советник и задачи. Компонент задач использует службу задач, чтобы получить задачи для пользователя через вызов API, а затем отображает список задач. Пользователь может нажать на задачу, чтобы просмотреть детали задачи. Я использую класс Global, который импортируется всеми компонентами для хранения контекстной информации, такой как имя пользователя и токен API, полученный после аутентификации.
Я заменил компонент приветствия компонентом профиля, идея в то время как кнопка профиля отображается на панели действий, и из любого места в представлении вкладок пользователь может нажать кнопку профиля, чтобы просмотреть страницу профиля. Я достиг этого, включив следующий код в каждый из компонентов вкладки:
toProfile() {
this.re.navigateByUrl("/profile");
}
Я уверен, что это не самый эффективный способ сделать это, но это было то, что я придумал, и это работает. Страница профиля показывает немного информации и позволяет пользователю выйти из системы. Если пользователь назначен администратором, он предоставляет форму, позволяющую администратору выдавать себя за любого другого пользователя и видеть приложение в точности так, как этот пользователь. В следующем коде отображается олицетворенная форма:
<GridLayout *ngIf="isAdmin" columns="auto, auto" rows="auto, auto">
<TextField hint="username" [(ngModel)]="impersonateUser" row="1" col="0"></TextField>
<button text="Impersonate" (tap)="impersonate()" row="1" col="1"></button>
</GridLayout>
Компонент профиля импортирует службу пользователя, службу задачи и класс Global. Когда пользователь с правами администратора вводит имя пользователя (например, мы будем использовать «user2») и нажимает «олицетворять», вызывается следующая функция в компоненте профиля:
impersonate() {
Global.username = this.impersonateUser;
Global.isAdmin = "0";
this.taskService.reset();
this.userService.getUserInfo(Global.username)
.subscribe(
(resp) => {
this.userService.saveSession(Global.username, Global.token, Global.expires);
this.re.navigateByUrl("/tabs/default", {clearHistory: true});
},
(exception) => {
alert("Something went wrong.");
}
);
}
Функция сброса службы задач просто очищает любые данные служба задач была в памяти. В конце я перехожу к / tabs / default, чтобы активировать функции onInit компонентов, чтобы новые задачи выполнялись для пользователя, выдавшего себя за другого. Страница задач загружается и отображает правильные задачи, которые соответствуют user2, с помощью следующего кода:
<ng-template ngFor let-task [ngForOf]="tasks">
<GridLayout class="data-container" columns="*, auto" rows="auto, auto" [nsRouterLink]="['../task', task.ID]">
<Label [text]="task.TITLE" class="task-title" row="0" col="0"></Label>
<FlexboxLayout class="task-date" row="1" col="0">
<Label [text]="task.START_DATE | slice:0:10 | date:'MMM d, yyyy'"></Label>
<Label text=" - "></Label>
<Label [text]="task.END_DATE | slice:0:10 | date:'MMM d, yyyy'"></Label>
</FlexboxLayout>
<Label text="" class="fas task-status" [ngClass]="{'completed' : task.COMPLETED}" rowSpan="2" col="1"></Label>
</GridLayout>
</ng-template>
Everythign работает до этой точки. Когда пользователь с правами администратора нажимает на одну из задач, чтобы просмотреть детали задачи, я получаю следующую ошибку:
Error: Uncaught (in promise): TypeError: undefined is not an object (evaluating 'this.currentOutlet.peekState')
Когда я проверяю элементы с помощью инструментов Chrome dev, я вижу, что элемент GridLayout имеет правильный идентификатор, который соответствует задаче, на которую он должен ссылаться
<GridLayout ng-reflect-params="../task,5e46c219add54" iosOverflowSafeArea="true" classNAme="data-container">
Любая помощь или понимание будет принята с благодарностью. Я относительно новичок в Angular и NativeScript.
РЕДАКТИРОВАТЬ: Вот ссылка на площадку NS, где вы можете увидеть проблему в действии. Я удалил практически все, что не нужно для репликации проблем.
Для репликации:
- Войдите в систему с именем пользователя "u1".
- Go на вкладку задач и нажмите одну из задач. Вы перейдете к деталям задания.
- Нажмите кнопку «Профиль» на панели действий.
- На странице профиля введите u2 в поле имени пользователя в разделе «Администратор» и нажмите кнопку олицетворения. Вы вернетесь на панель мониторинга как пользователь 2.
- Go на вкладку задач и коснитесь одной из задач.
При нажатии на задачу вы попадете к деталям задачи. но вместо этого выдает ошибку, описанную выше.
ПРИМЕЧАНИЕ. Нажатие на любую из задач на панели мониторинга в любое время не будет работать. Это еще одна проблема, которую я пытаюсь выяснить. Если вы поможете мне разобраться, что я делаю там неправильно, это было бы очень признательно.