2017-01-19 8 views
0

Когда я нажимаю на один из элементов ul, я получаю сообщение об ошибке «setContentHeight» не является функцией. Однако, если я вызываю эту функцию из ngAfterViewInit(), например, я не получаю ошибок. Что мне здесь не хватает? Я очень новичок в Angular2 и в интернете, поэтому извините, если это очень очевидно. Благодаря!Angular2 click get «is not a function» error

import { Component, OnInit } from '@angular/core'; 
import { Router } from '@angular/router'; 

declare var jQuery: any; 

declare var $BODY; 
declare var $MENU_TOGGLE; 
declare var $SIDEBAR_MENU; 
declare var $SIDEBAR_FOOTER; 
declare var $LEFT_COL; 
declare var $RIGHT_COL; 
declare var $NAV_MENU; 
declare var $FOOTER; 

@Component({ 
    moduleId: module.id, 
    selector: 'side-nav', 
    templateUrl: 'sidenav.component.html' 
}) 


export class SideNavComponent implements OnInit { 

constructor(private router: Router) { 

} 

ngAfterViewInit(): void { 
    this.plot(); 
} 

anchorClicked(event: MouseEvent) { 
    console.log('anchor clicked'); 

    var target = event.srcElement.id; 

    var $li = jQuery('#' + target.replace("chevron", "li")).parent(); 

    if ($li.is('.active')) { 
     $li.removeClass('active active-sm'); 
     jQuery('ul:first', $li).slideUp(function() { 
      //this.setContentHeight(); 
     }); 
    } else { 
     // prevent closing menu if we are on child menu 
     if (!$li.parent().is('.child_menu')) { 
      jQuery('#sidebar-menu').find('li').removeClass('active active-sm'); 
      jQuery('#sidebar-menu').find('li ul').slideUp(); 
     } 

     $li.addClass('active'); 

     jQuery('ul:first', $li).slideDown(function() { 
      //this.setContentHeight(); 
     }); 
    } 
} 

plot() { 
    console.log('in sidebar'); 

    $BODY = jQuery('body'); 
    $MENU_TOGGLE = jQuery('#menu_toggle'); 
    $SIDEBAR_MENU = jQuery('#sidebar-menu'); 
    $SIDEBAR_FOOTER = jQuery('.sidebar-footer'); 
    $LEFT_COL = jQuery('.left_col'); 
    $RIGHT_COL = jQuery('.right_col'); 
    $NAV_MENU = jQuery('.nav_menu'); 
    $FOOTER = jQuery('footer'); 

    var $a = $SIDEBAR_MENU.find('a'); 
    $SIDEBAR_MENU.find('a').on('click', function (ev) {       
     var $li = jQuery(this).parent();    
     if ($li.is('.active')) { 
      $li.removeClass('active active-sm'); 
      jQuery('ul:first', $li).slideUp(function() { 
       this.setContentHeight(); 
      }); 
     } else { 
      // prevent closing menu if we are on child menu 
      if (!$li.parent().is('.child_menu')) { 
       $SIDEBAR_MENU.find('li').removeClass('active active-sm'); 
       $SIDEBAR_MENU.find('li ul').slideUp(); 
      } 

      $li.addClass('active'); 

      jQuery('ul:first', $li).slideDown(function() { 
       this.setContentHeight(); 
      }); 
     } 
    }); 

    // toggle small or large menu 
    $MENU_TOGGLE.on('click', function() { 
     if ($BODY.hasClass('nav-md')) { 
      $SIDEBAR_MENU.find('li.active ul').hide(); 
      $SIDEBAR_MENU.find('li.active').addClass('active-sm').removeClass('active'); 
     } else { 
      $SIDEBAR_MENU.find('li.active-sm ul').show(); 
      $SIDEBAR_MENU.find('li.active-sm').addClass('active').removeClass('active-sm'); 
     } 

     $BODY.toggleClass('nav-md nav-sm'); 

     this.setContentHeight(); 
    }); 

} 


setContentHeight() { 
    console.log('set content height'); 
    // reset height 
    $RIGHT_COL.css('min-height', jQuery(window).height()); 

    var bodyHeight = $BODY.outerHeight(), 
     footerHeight = $BODY.hasClass('footer_fixed') ? -10 : $FOOTER.height(), 
     leftColHeight = $LEFT_COL.eq(1).height() + $SIDEBAR_FOOTER.height(), 
     contentHeight = bodyHeight < leftColHeight ? leftColHeight : bodyHeight; 

    // normalize content 
    contentHeight -= $NAV_MENU.height() + footerHeight; 

    $RIGHT_COL.css('min-height', contentHeight); 
} 

ngOnInit() { 
    console.log('hello `sidebar` component'); 
} 

} 
+0

я бы, возможно, последуют примеру героев, чтобы узнать, как использовать Угловое, вместо всего этого JQuery , Вы будете удивлены, насколько легко вы достигнете этого с помощью Angular – catu

ответ

2

Это потому, что «это» имеет неправильный контекст и связано с селектором jquery вместо компонента.

добавить в начале anchorClicked функции

let self = this; 

затем использовать в этой функции

self.setContentHeight(); 
+0

Спасибо! Имеет смысл! – Nick