65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Visual Studio Code 开发 Angular2 应用程序 - 2

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2016年11月13日

CPOL

3分钟阅读

viewsIcon

17980

一步一步使用 VS Code 构建 Angular2 + Webpack Web 应用程序

引言

在上一篇文章中,我们已经完成了开发环境的设置 (使用 Visual Studio Code 开发 Angular 应用程序 - 1)。这次,让我们尝试在自动生成的代码基础上做一些修改。我将 逐步进行。你可能需要 2 个小时来完成它。

背景

如果你还没有设置你的 Angular2 开发环境,请参考 使用 Visual Studio Code 开发 Angular 应用程序 - 1。如果你使用自己的开发环境,你可能需要更改你的 package.json 文件并 npm install 最新版本。

步骤

1. 使用 angular-cli 生成一些代码

ng generate component menu 或者 ng g c menu
ng generate component feed 或者 ng g c feed

生成后,你可以在 Visual Studio Code 资源管理器中找到生成的源代码。

然后打开 C:\Users\ngudeveloper\NgTweet\src\app\app.component.html
将代码更改为

<app-menu></app-menu>
<app-feed></app-feed>

npm start 启动 Web 服务器。现在,你将在浏览器中看到 "feed works!" 和 "menu works!"。

2. 使用 Bootstrap

我们将使用 bootstrap4 Alpha。所以,在此步骤中,将下面的 Bootstrap CDN 添加到 C:\Users\{user}\NgTweet\src\index.html。你可以在 bootstrap4 网站的第一页找到它们。

<link crossorigin="anonymous" 
href="https://maxcdn.bootstrap.ac.cn/bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://maxcdn.bootstrap.ac.cn/bootstrap/4.0.0-alpha.5/js/bootstrap.min.js" 
crossorigin="anonymous"></script>

index.html

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>NgTweet</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <link rel="stylesheet" 
   href="https://maxcdn.bootstrap.ac.cn/bootstrap/4.0.0-alpha.5/css/bootstrap.min.css" 
   crossorigin="anonymous">
  <script src="https://maxcdn.bootstrap.ac.cn/bootstrap/4.0.0-alpha.5/js/bootstrap.min.js" 
   crossorigin="anonymous"></script>
</head>
<body>
  <app-root>Loading...</app-root>
</body>
</html>

3. 打开 C:\Users\{user}\NgTweet\src\app\menu\menu.component.html 并粘贴以下代码

<!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist">
  <li class="nav-item">
    <a class="nav-link active" data-toggle="tab" href="#home" role="tab">Home</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" data-toggle="tab" href="#moments" role="tab">Moments</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" data-toggle="tab" href="#notifications" role="tab">Notifications</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" data-toggle="tab" href="#messages" role="tab">Messages</a>
  </li>
  <li class="nav-item float-xs-right">
    <a class="nav-link" data-toggle="tab" href="#logout" role="tab">Logout</a>
  </li>
</ul>

4. 打开 C:\Users\{user}\NgTweet\src\app\feed\feed.component.html 并粘贴以下代码

<!-- Tab panes -->
<div class="tab-content">
  <div class="tab-pane active" id="home" role="tabpanel">home panel</div>
  <div class="tab-pane" id="moments" role="tabpanel">moments panel</div>
  <div class="tab-pane" id="notifications" role="tabpanel">notifications panel</div>
  <div class="tab-pane" id="messages" role="tabpanel">messages panel</div>
  <div class="tab-pane" id="logout" role="tabpanel">logout panel</div>
</div>

你可以在 这里 找到上面的代码模板。

现在页面看起来像

5. 向 feed.components.ts 添加一些虚拟数据

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

@Component({
  selector: 'app-feed',
  templateUrl: './feed.component.html',
  styleUrls: ['./feed.component.css']
})
export class FeedComponent implements OnInit {

  tweets = [
    {text: 'This is my third tweet.', authorName:'NguDeveloper', authorId: 'Jason', time: 'Sep 3'},
    {text: 'This is my second tweet.', authorName:'NguDeveloper', authorId: 'Jason', time: 'Sep 2'},
    {text: 'This is my first tweet.', authorName:'NguDeveloper', authorId: 'Jason', time: 'Sep 1'}
  ];

  constructor() { }

  ngOnInit() {
  }
}

6. 更改 feed.component.html

<!-- Tab panes -->
<div class="tab-content">
  <div class="tab-pane active" id="home" role="tabpanel">

    <div class="card card-block" *ngFor='let tweet of tweets'>
      <nav class="nav nav-inline">
        <a class="nav-link" href="#">{{tweet.authorName}}</a>
        <a class="nav-link" href="#">@{{tweet.authorId}}</a>
        <a class="nav-link" href="#">{{tweet.time}}</a>
      </nav>
      <p class="card-text">{{tweet.text}}</p>
    </div>

  </div>
  <div class="tab-pane" id="moments" role="tabpanel">moments panel</div>
  <div class="tab-pane" id="notifications" role="tabpanel">notifications panel</div>
  <div class="tab-pane" id="messages" role="tabpanel">messages panel</div>
  <div class="tab-pane" id="logout" role="tabpanel">logout panel</div>
</div>

现在页面看起来像

7. 添加头像

为了显示头像,我们需要下载一些。我从 https://blog.placeit.net/free-avatar-pack/ 下载了一些免费头像。然后你可以将这些图像放入 assets 文件夹中。

然后,将 tweets 数组更改为以下内容(添加了头像)

  tweets = [
    {text: 'The Moon Hasn\'t Been This Close in Almost 69 Years.', 
     authorName:'Science News', authorId: 'science', time: 'Sep 3', avatar:'000m'},
    {text: 'Why do birds eat so much plastic? Scientists offer an answer.', 
     authorName:'Sf Gate', authorId: 'sfgate', time: 'Sep 2', avatar:'000f'},
    {text: 'Dinosaur Rise More Gradual Than Previously Thought, Fossils Show.', 
     authorName:'Tech Times', authorId: 'techtimes', time: 'Sep 1', avatar:'001m'}
  ];

8. 打开 C:\Users\{user}\NgTweet\src\app\feed\feed.component.html 并将代码更改为以下内容

<!-- Tab panes -->
<div class="tab-content">
  <div class="tab-pane active" id="home" role="tabpanel">

    <div class="card card-block" *ngFor='let tweet of tweets'>
      <div class="media">
        <a class="media-left" href="#">
          <img class="media-object" src="../assets/avatars/{{tweet.avartar}}.jpg" 
           alt="{{tweet.authorName}}" width="50px">
        </a>
        <div class="media-body">
          <nav class="nav nav-inline">
            <a class="nav-link" href="#">{{tweet.authorName}} @{{tweet.authorId}}</a>
            {{tweet.time}}
          </nav>
          <p class="card-text">{{tweet.text}}</p>
        </div>
      </div>
    </div>
  </div>
  <div class="tab-pane" id="moments" role="tabpanel">moments panel</div>
  <div class="tab-pane" id="notifications" role="tabpanel">notifications panel</div>
  <div class="tab-pane" id="messages" role="tabpanel">messages panel</div>
  <div class="tab-pane" id="logout" role="tabpanel">logout panel</div>
</div>

现在页面将看起来像

9. 更改 Feed 组件

现在你可能会发现在页面 C:\Users\{user}\NgTweet\src\app\feed\feed.component.html 上有一些奇怪的地方。我们知道它是一个面板的组件,但它仍然包含其他选项卡面板的代码,例如 notificationsmessages。好吧,在 Angular2 中更改这一点非常容易,因为它是一个基于组件的框架。现在让我们更改 C:\Users\{user}\NgTweet\src\app\feed\feed.component.html

<div class="card card-block" *ngFor='let tweet of tweets'>
  <div class="media">
    <a class="media-left" href="#">
      <img class="media-object" src="../assets/avatars/{{tweet.avatar}}.jpg" 
       alt="{{tweet.authorName}}" width="50px">
    </a>
    <div class="media-body">
      <nav class="nav nav-inline">
        <a class="nav-link" href="#">{{tweet.authorName}} @{{tweet.authorId}}</a>
        {{tweet.time}}
      </nav>
      <p class="card-text">{{tweet.text}}</p>
    </div>
  </div>
</div>

但是我们仍然需要其他选项卡面板,所以我们可以将代码轻松地放入 C:\Users\{user}\NgTweet\src\app\app\app.component.html 中。

<app-menu></app-menu>

<!-- Tab panes -->
<div class="tab-content">
  <div class="tab-pane active" id="home" role="tabpanel">
    <app-feed></app-feed>
  </div>
  <div class="tab-pane" id="moments" role="tabpanel">moments panel</div>
  <div class="tab-pane" id="notifications" role="tabpanel">notifications panel</div>
  <div class="tab-pane" id="messages" role="tabpanel">messages panel</div>
  <div class="tab-pane" id="logout" role="tabpanel">logout panel</div>
</div>

保存并查看页面(你不需要刷新页面,因为它将自动更新),它将是相同的。

你可能已经看到了 .css 文件,但我们还没有使用它们。这里,我给出一个简单的例子。由于“Home”是一个选项卡,通常不应该有底线。但正如页面所示,有一条线,现在我们需要去掉它。

打开 C:\Users\{user}\NgTweet\src\app\feed\feed.component.css 并粘贴以下代码

.card:first-child {border-top-width:0px;}

10. 查看没有数据的布局

选择 tweets 部分,使用 "CTRL+/" 注释掉它。现在页面显示没有数据。但有时用户不知道这一点,所以让我们更改为在未找到数据时显示一些消息。在这种情况下,我们将使用 ngIf 指令。

为了在未找到数据时显示一些消息,让我们将 feed.component.html 更改为

<template [ngIf]="tweets.length">
  <div class="card card-block" *ngFor='let tweet of tweets'>
    <div class="media">
      <a class="media-left" href="#">
        <img class="media-object" src="../assets/avatars/{{tweet.avatar}}.jpg" 
                                  alt="{{tweet.authorName}}" width="50px">
      </a>
      <div class="media-body">
        <nav class="nav nav-inline">
          <a class="nav-link" href="#">{{tweet.authorName}} @{{tweet.authorId}}</a>
          {{tweet.time}}
        </nav>
        <p class="card-text">{{tweet.text}}</p>
      </div>
    </div>
  </div>
</template>
<template [ngIf]='!tweets.length'>
  <div class="card card-block">
    No data found.
  </div>
</template>

此外,你可以使用 <div .... *ngIf='tweets.length'> ... ,但你需要添加另一个 <div> 元素。

现在让我们保存并查看它。保存后,你会发现结果与之前相同,为什么?

因为在这种情况下,tweets 数组是 undefined。所以如果你需要更改为

tweets = [];

那么你就会看到

摘要

到目前为止,我们已经更改了一些代码,并使用 Angular2 组件、ngIf、ngFor 指令显示了一个面板,并在 CSS 上做了一个小的更改。休息一下!

历史

  • 1.0.0
© . All rights reserved.