该代码有什么问题?我正在尝试在Angular的TS中移动JS代码

时间:2018-11-10 09:27:02

标签: javascript angular typescript angular6

我正在尝试在Angular的TypeScript中实现此JavaScript代码,但在某些行下显示红线。

这是原始的JavaScript代码:

function openModal() {
  document.getElementById('myModal').style.display = "block";
}

function closeModal() {
  document.getElementById('myModal').style.display = "none";
}

var slideIndex = 1;
showSlides(slideIndex);

function plusSlides(n) {
  showSlides(slideIndex += n);
}

function currentSlide(n) {
  showSlides(slideIndex = n);
}

function showSlides(n) {
  var i;
  var slides = document.getElementsByClassName("mySlides");
  var dots = document.getElementsByClassName("demo");
  var captionText = document.getElementById("caption");
  if (n > slides.length) {slideIndex = 1}
  if (n < 1) {slideIndex = slides.length}
  for (i = 0; i < slides.length; i++) {
      slides[i].style.display = "none";
  }
  for (i = 0; i < dots.length; i++) {
      dots[i].className = dots[i].className.replace(" active", "");
  }
  slides[slideIndex-1].style.display = "block";
  dots[slideIndex-1].className += " active";
  captionText.innerHTML = dots[slideIndex-1].alt;
}

这是我在Angular的TypeScript中进行更改并实现的示例:

export class NewComponent implements OnInit {

  constructor() { }

  ngOnInit() {

  }

   openModal() {
    document.getElementById('myModal').style.display = "block";
  }

  closeModal() {
    document.getElementById('myModal').style.display = "none";
  }

   slideIndex = 1;
  showSlides(slideIndex);

   plusSlides(n) {
    this.showSlides(this.slideIndex += n);
  }

   currentSlide(n) {
    this.showSlides(this.slideIndex = n);
  }

   showSlides(n) {
    let i;
    const slides = document.getElementsByClassName("mySlides");
    const dots = document.getElementsByClassName("demo");
    const captionText = document.getElementById("caption");
    if (n > slides.length) {this.slideIndex = 1}
    if (n < 1) {this.slideIndex = slides.length}
    for (i = 0; i < slides.length; i++) {
        slides[i].style.display = "none";
    }
    for (i = 0; i < dots.length; i++) {
        dots[i].className = dots[i].className.replace(" active", "");
    }
    slides[this.slideIndex-1].style.display = "block";
    dots[this.slideIndex-1].className += " active";
    captionText.innerHTML = dots[this.slideIndex-1].alt;
  }

}

错误显示在plusSlides(n)行和slides[i].style.display = "none";

对于第一个,它说什么都没有显示红色下划线,对于第二个来说,它说类型“元素”上不存在属性样式。但是我想我在编辑的示例中也犯了其他错误。因为每次我修复某些内容时,它都会在另一个地方显示另一个新的红色下划线。如何解决这些问题并使上面的JS代码在我的Angular项目中完全可行?

2 个答案:

答案 0 :(得分:0)

第二个错误只是抱怨类型。您可以将“ slides”和“ dots”声明为any,尽管您可能想找到一个更合适的类型,但您的代码也不会抱怨:

const slides:any = document.getElementsByClassName("mySlides");
const dots:any = document.getElementsByClassName("demo");

关于第一个错误,问题在于以下几行:

slideIndex = 1;
showSlides(slideIndex);

这些线在班级内部做什么? “ slideIndex”是您要初始化为1的类成员吗?还是您要执行类方法?

如果是后者,则应在类之外,并具有以下内容:

export class NewComponent implements OnInit {

  public slideIndex; // Needed if you want to access this.slideIndex in your methods

  constructor() { }

  ngOnInit() { }

   openModal() { /* ... */  }

  closeModal() { /* ... */ }

   plusSlides(n) { /* ...   */  }

   currentSlide(n) { /* ... */  }

   showSlides(n) { /* ... */  }

}  // Class definition ends here

// Now, using the class you defined by creating a new instance
let greeter = new NewComponent();
let slideIndex = 1;
greeter.showSlides(slideIndex); 

答案 1 :(得分:0)

这是因为您尝试在声明部分调用showSlides(slideIndex);。你真的不能那样做。如果要在初始化期间调用某个方法,则应在constructorngOnInit中进行。除此之外,我没有发现任何可能导致编译问题的内容。值得注意的是,您应该以角度方式重构此代码。您自己在进行DOM操作,并且始终有更好的方法来使用Angular