ViewChild — Угловой 2 Javascript

Как я могу использовать ViewChild в Angular 2 Javascript? Я ссылался на документы angular.io и пытался использовать следующий код, но он не работает. Может кто-нибудь помочь мне? Заранее спасибо.

main.html

<router-outlet></router-outlet>

app.component.js

(function (app) {

app.AppComponent = ng.core
        .Component({
            selector: 'my-app',
            templateUrl: 'app/views/main.html',
            directives: [ng.router.ROUTER_DIRECTIVES], //<----not loading components here
            viewProviders: [ng.http.HTTP_PROVIDERS],
            queries: {
                'viewChild1Component': new ng.core.ViewChild(app.Child1Component) //Parent calls Child 1 using ViewChild
            },
        })
        .Class({
            constructor: [ng.router.Router, ng.http.Http, function (router, http) {
                this.router = router;
                this.http = http;

            }],
            ngAfterViewInit: function () {
                this.viewChild1Component.onSubmit();
            },
        });

ng.router
        .RouteConfig([
          //loading components here
          { path: '/child1', component: app.Child1Component, name: 'Child 1', useAsDefault: true }, 
        ])(app.AppComponent);

})(window.app || (window.app = {}));

child1.js

(function (app) {

    app.Child1Component = ng.core
            .Component({
                selector: 'test',
                template: '<div>Test</div>',
            })
            .Class({
                constructor: [ng.router.Router, function (router) {
                    this.router = router;
                }],
                onSubmit: function () {
                    alert('Call from Parent');
                },
            });

})(window.app || (window.app = {}));

index.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <!-- 1. Load libraries -->
    <script src="scripts/traceur-runtime.js"></script>
    <script src="scripts/system.js"></script>
    <!-- IE required polyfill -->
    <script src="scripts/es6-shim.min.js"></script>

    <script src="scripts/angular2-polyfills.js"></script>
    <script src="scripts/Rx.umd.js"></script>
    <script src="scripts/angular2-all.umd.js"></script>

    <!--components-->
    <script src="app/components/child1.js"></script>
    <script src="app/components/child2.js"></script>

    <!-- 2. Load our 'modules' -->
    <script src='app/app.component.js'></script>
    <script src='app/boot.js'></script>

</head>
<!-- 3. Display the application -->
<body>
    <my-app>Loading...</my-app>
</body>
</html>

person Abraham Gnanasingh    schedule 07.03.2016    source источник
comment
Вы можете увидеть пример здесь stackoverflow.com/a/34573219/4933038   -  person Eric Martinez    schedule 07.03.2016


Ответы (1)


Вам необходимо определить свое поле в атрибуте queries метаданных вашего компонента, как описано ниже:

var AppComponent = ng.core.
  Component({
    selector: "app", 
    template:
      '<div>' +
      '  <test></test>' +
      '</div>',
    queries: {
      'subComponent': new ng.core.ViewChild(TestComponent) <-----
    },
    directives: [ TestComponent ]
  })
  .Class({
    constructor: function() {
    },

    ngAfterViewInit:function(){
      this.subComponent.onSubmit();
    }
  });

subComponent будет установлен до вызова хука ngAfterViewInit.

Предыдущий код опирается на следующие TestComponent:

var TestComponent = ng.core.Component({
    selector:'test',
    template: '<div>Test</div>'
  }).Class({
    constructor: function(){
    },

    onSubmit: function(){
      console.log('onSubmit');
    }
  });

Изменить

В вашем случае вы используете маршрутизацию. Это означает, что ваше свойство viewChild1Component будет установлено после вызова метода ngAfterViewInit, поскольку компонент Child1Component загружается в router-outlet after. На самом деле все динамично...

Если вы используете свойство viewChild1Component после (например, по клику), это сработает... См. пример ниже:

app.AppComponent = ng.core.
  Component({
    selector: "app", 
    template:
     '<div>' +
     '  <router-outlet></router-outlet>' +
     '  <div (click)="submit()">Submit</div>' +
     '</div>',
  queries: { 'viewChild1Component': new ng.core.ViewChild(Child1Component) },
  directives: [ng.router.ROUTER_DIRECTIVES]
})
.Class({
  submit: function() {
    console.log('#### submit');
    this.viewChild1Component.onSubmit();
  }
});
person Thierry Templier    schedule 07.03.2016
comment
Это снова ты! Спасибо и Любовь. Я попробовал ваш код и работает на 100% нормально. Я понял ваш код и обнаружил, что проблема в моем приложении заключается в том, что я использовал маршрутизацию. Я не загружаю компонент в шаблон. Я загружаю компонент в <router-outlet></router-outlet>, используя ng.router.RouteConfig. Поэтому я не могу просмотреть ребенка в ngAfterViewInit - person Abraham Gnanasingh; 08.03.2016
comment
Пожалуйста! Что касается вашего последнего вопроса, вы пытаетесь сослаться на компонент, загруженный в router-outlet, из компонента, который использует router-outlet. Верно? - person Thierry Templier; 08.03.2016
comment
Ага. Я не загружаю компонент в директивы. Я загружаю компонент с помощью ng.router.RouteConfig. Я отредактировал этот вопрос. Пожалуйста, проверь это. Вы получите представление о том, что я сделал. - person Abraham Gnanasingh; 08.03.2016
comment
Ладно, вижу знаю. На самом деле подкомпонент загружается в router-outlet после вызова метода ngAfterViewInit. Таким образом, свойство viewChild1Component следует использовать позже (например, по щелчку мыши). Я обновил свой ответ... - person Thierry Templier; 08.03.2016
comment
Теперь работает нормально. Большое спасибо. И мне нужна еще 1 помощь от вас. Я хочу знать, как использовать CanActivate в Javascript. Мой пост о CanActivate. Это ссылка, по которой я разместил. Пожалуйста, проверьте это и помогите мне решить проблему - person Abraham Gnanasingh; 08.03.2016
comment
Я думаю, недостаточно благодарить вас снова и снова. Мои наилучшие пожелания тебе во всем - person Abraham Gnanasingh; 08.03.2016
comment
Есть ли возможность прослушивания после загрузки компонента router-outlet? - person Abraham Gnanasingh; 08.03.2016
comment
Вы можете использовать хуки жизненного цикла компонентов (что-то вроде ngAfterViewInit). Что именно вы хотите сделать? - person Thierry Templier; 08.03.2016
comment
Давайте продолжим обсуждение в чате. - person Abraham Gnanasingh; 08.03.2016
comment
Так как я использовал router-outlet, а вы сказали, что я могу использовать ViewChild после вызова метода ngAfterViewInit. Вот почему я спрашиваю, есть ли возможность слушать после загрузки компонента router-outlet? - person Abraham Gnanasingh; 08.03.2016
comment
Я не могу добавлять запросы ViewChild в версию angular 2 rc. Можете ли вы помочь мне решить эту проблему? Можете ли вы дать правильный код для этого? - person Abraham Gnanasingh; 15.05.2016
comment
Можете ли вы посмотреть мой новый вопрос в ссылке и решить мою проблему? - person Abraham Gnanasingh; 20.05.2016
comment
Буду ли я использовать от имени EventEmitter? Или EventEmitter — это другое понятие? Поскольку я новичок в Angular 2, так что... @ThierryTemplier - person Jignesh Vagh; 29.06.2017