【问题标题】:Passing Variables into template from Function将变量从函数传递到模板
【发布时间】:2025-12-06 16:05:02
【问题描述】:

我正在使用 @ViewChild 将值传递给子模板函数 - 基本上,父级将值传递给下面的 transition() 函数,将其传递到控制台日志没有问题,但我希望在模板,上面写着“价值是 {{ 价值}}”,但它只是保持空白.. 有什么想法吗?

            import {Component, Input, Output, EventEmitter} from '@angular/core';

            @Component({
            selector: 'reptilehaus-loader',
            template: `<div class="loader">THE VALUE IS {{ value }}</div>`,
            styles: [`
            .loader {
            background-color: white;
            height: 100px;
            width:100px;
            position:absolute;
            top:0;
            right:0;
            color: black;
            z-index:99999;
            }
            `]
            })


            export class TransitionComponent  {

                value: string;

                    constructor() {}

                    transition(value) {
                        console.log(value);
                    }


            }

父视图

            import {Component, ElementRef, OnInit, ViewChild} from '@angular/core';
            import {ProjectsMainApi} from '../../../services/projects-main';
            import 'rxjs/Rx';
            import {Observable} from 'rxjs/Observable';
            import { ROUTER_DIRECTIVES } from '@angular/router-deprecated';
            import {CanDeactivate, RouteTree} from '@angular/router';
            import {TransitionComponent} from '../../PageLoader/TransitionComponent';
            declare var jQuery: any;


            // <a class="project-display-matrice" *ngFor="let projekt of project | async" [routerLink]="['ProjectDetail', { projectlink: projekt.slug }]" >

            @Component({
                selector: 'projects',
                template:
                    `<div> template here  </div>
                    </a><loader></loader>`,
                directives: [ROUTER_DIRECTIVES,TransitionComponent]
            })

            export class ProjectsListComponent implements CanDeactivate, OnInit {

                elementRef: ElementRef;
                project: Observable<any>;

                @ViewChild(TransitionComponent) transitionComponent: TransitionComponent;


                constructor() {
                }
                ngOnInit() {

                }

                routerCanDeactivate(currTree?: RouteTree, futureTree?: RouteTree): Promise<boolean> {
                   console.log('PROJECT LIST');
                   // console.log('Item: ', currTree);
                   this.transitionComponent.transition("sdfsfsdf");       
                    return new Promise((resolve, reject) => {
                        jQuery('.loader').addClass('show');
                        setTimeout(() => resolve(true), 1000);
                    });
                }

                changeRoute() {

                    alert('test');

                }

            }

基本上,每当有人单击路由时,routerCanDeactivate 应该会产生延迟并显示加载组件,但我对如何完成此操作非常迷茫,所以我可能完全走错了方向......基本上是当用户单击链接时我希望一个 div 与我的徽标一起在屏幕上转换,并在页面准备就绪时消失。

目前 routercandeactive 只是将一个字符串传递给我的子视图中的函数,也就是使用 this.transitionComponent.transition("sdfsfsdf"); 的加载器;

【问题讨论】:

  • 为什么不使用绑定将值从父级传递给子级。我没有看到足够的上下文来确定你试图完成什么。
  • 我是 ng2 的新手,所以我还没有进入绑定。我正在尝试做一个预加载器,所以基本上当用户导航到父页面时,我想显示上述组件 2 秒,然后使用超时删除一个类
  • 嗯,这很抽象。您能否提供更多代码来显示事物是如何连接的?
  • 是的,对不起,我可能解释得不好..我已经更新了更多代码和一些信息
  • 我试过了。请参阅下面的答案。

标签: angular angular2-template angular2-directives


【解决方案1】:

您可以使用模板绑定来获取从父级到子级传递和更新的值:

      @Component({
        selector: '...',
        directives: [TransitionComponent]
        template: '<reptilehaus-loader [value]="transition"></reptilehaus-loader>'
      })
      export class ProjectsListComponent implements CanDeactivate, OnInit {
            transition:any;
            elementRef: ElementRef;
            project: Observable<any>;

            routerCanDeactivate(currTree?: RouteTree, futureTree?: RouteTree): Promise<boolean> {
               console.log('PROJECT LIST');
               // console.log('Item: ', currTree);
               this.transition = "sdfsfsdf";       
                return new Promise((resolve, reject) => {
                    jQuery('.loader').addClass('show');
                    setTimeout(() => resolve(true), 1000);
                });
            }

            changeRoute() {
                alert('test');
            }
        }
       export class TransitionComponent  {
            @Input() value: string;
       }

【讨论】:

  • 谢谢Gunter .. 你又一次教会了我一些东西 :) 只是出于兴趣,在你看来,在 ng2 中创建预加载器的最佳方法是什么.. 我还没有在网上看到很多关于它的信息
  • 不确定“预加载器”是什么意思:D。它是在加载时显示的微调器吗?如果是用于应用程序加载,那么我应该有一个原始示例的答案。如果是为了更改路线,那么至少还有一个其他答案。我不得不查一下。首先我需要知道你所说的“预加载器”是什么意思。
  • 基本上,当我导航到不同的页面时,有时会在等待来自 API 的数据时出现延迟。它通常只是非常轻微,但我宁愿在屏幕上显示一个 div 幻灯片每个页面加载的延迟,同样只是非常轻微,但我的完美主义者宁愿展示我的徽标
  • 所以是的,我猜是基于路由的加载器/带有徽标的全屏 div
  • 我认为没有好的解决方案。很快就会再次推出新的路由器,并且动画模块也即将推出。我想当这些都出来时调查更有意义。我猜路由器最终会为这个用例提供开箱即用的动画支持。