ng--todolist

来源:https://www.cnblogs.com/ygjzs/archive/2020/01/21/12225768.html
-Advertisement-
Play Games

todolist小案例 "該案例的模板文件下載地址" 走外國伺服器, ̄□ ̄|| app.module.ts 核心組件app.component.ts 發現這倆不是同一類文件,哈哈哈,٩(๑ ◡ !t.done) } else if (this.visibility === 'completed') ...


todolist小案例

該案例的模板文件下載地址

走外國伺服器, ̄□ ̄||

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';


import { AppComponent } from './app.component';
import { FormsModule } from '@angular/forms';


@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

核心組件app.component.ts

發現這倆不是同一類文件,哈哈哈,٩(๑>◡<๑)۶

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

const todos = [
  {
    id: 1,
    title: '吃飯',
    done: true
  },
  {
    id: 2,
    title: '唱歌',
    done: false
  },
  {
    id: 3,
    title: '寫代碼',
    done: true
  }
]

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  public todos: {
    id: number,
    title: string,
    done: boolean
  }[] = JSON.parse(window.localStorage.getItem('todos') || '[]')

  public visibility: string = 'all'

  public currentEditing: {
    id: number,
    title: string,
    done: boolean
  } = null

  // 該函數是一個特殊的 Angular 生命周期鉤子函數
  // 它會在 Angular 應用初始化的時候執行一次
  ngOnInit () {
    // 初始化的時候手動調用一次
    this.hashchangeHandler()

    // 註意:這裡要 bind this綁定
    window.onhashchange = this.hashchangeHandler.bind(this)
  }

  // 當 Angular 組件數據發生改變的時候,ngDoCheck 鉤子函數會被觸發
  // 我們要做的就是在這個鉤子函數中去持久化存儲我們的 todos 數據
  ngDoCheck() {
    window.localStorage.setItem('todos', JSON.stringify(this.todos))
  }

  get filterTodos () {
    if (this.visibility === 'all') {
      return this.todos
    } else if (this.visibility === 'active') {
      return this.todos.filter(t => !t.done)
    } else if (this.visibility === 'completed') {
      return this.todos.filter(t => t.done)
    }
  }

  // 實現導航切換數據過濾的功能
  // 1. 提供一個屬性,該屬性會根據當前點擊的鏈接返回過濾之後的數據
  //   filterTodos
  // 2. 提供一個屬性,用來存儲當前點擊的鏈接標識
  //    visibility 字元串
  //    all、active、completed
  // 3. 為鏈接添加點擊事件,當點擊導航鏈接的時候,改變
  //     

  addTodo (e): void {
    const titleText = e.target.value
    if (!titleText.length) {
      return
    }
    
    const last = this.todos[this.todos.length - 1]
    
    this.todos.push({
      id: last ? last.id + 1: 1,
      title: titleText,
      done: false
    })

    // 清除文本框
    e.target.value = ''
  }

  get toggleAll () {
    return this.todos.every(t => t.done)
  }

  set toggleAll (val: boolean) {
    this.todos.forEach(t => t.done = val)
  }

  removeTodo (index: number): void {
    this.todos.splice(index, 1)
  }

  saveEdit (todo, e) {
    // 保存編輯
    todo.title = e.target.value

    // 去除編輯樣式
    this.currentEditing = null
  }

  handleEditKeyUp (e) {
    const {keyCode, target} = e
    if (keyCode === 27) {
      // 取消編輯
      // 同時把文本框的值恢復為原來的值
      target.value = this.currentEditing.title
      this.currentEditing = null
    }
  }

  get remaningCount () {
    return this.todos.filter(t => !t.done).length
  }

  hashchangeHandler () {
    // 當用戶點擊了錨點的時候,我們需要獲取當前的錨點標識
      // 然後動態的將根組件中的 visibility 設置為當前點擊的錨點標識
    const hash = window.location.hash.substr(1)
    switch (hash) {
      case '/':
        this.visibility = 'all'
        break;
      case '/active':
        this.visibility = 'active'
        break;
      case '/completed':
        this.visibility = 'completed'
        break;
    }
  }

  // 清除所有已完成任務項
  clearAllDone () {
    this.todos = this.todos.filter(t => !t.done)
  }
}

模板app.component.html

<section class="todoapp">
  <header class="header">
    <h1>todos</h1>
    <input
      class="new-todo"
      placeholder="What needs to be done?"
      autofocus
      (keyup.enter)="addTodo($event)">
  </header>
  <ng-template [ngIf]="todos.length">
    <!-- This section should be hidden by default and shown when there are todos -->
<section class="main">
  <input
    id="toggle-all"
    class="toggle-all"
    type="checkbox"
    (change)="toggleAll = $event.target.checked"
    [checked]="toggleAll">
  <label for="toggle-all">Mark all as complete</label>
  <ul class="todo-list">
    <!-- These are here just to show the structure of the list items -->
    <!-- List items should get the class `editing` when editing and `completed` when marked as completed -->
    <!-- 
      li 是每一個任務項
      每個任務項有三種狀態:
        正常狀態 沒有樣式
        完成狀態 completed
        編輯狀態 editing
     -->
    <li
      *ngFor="let todo of filterTodos; let i = index;"
      [ngClass]="{
        completed: todo.done,
        editing: currentEditing === todo
      }">
      <div class="view">
        <input
          class="toggle"
          type="checkbox"
          [(ngModel)]="todo.done">
        <label (dblclick)="currentEditing = todo">{{ todo.title }}</label>
        <button
          class="destroy"
          (click)="removeTodo(i)"></button>
      </div>
      <input
        class="edit"
        [value]="todo.title"
        (keyup)="handleEditKeyUp($event)"
        (keyup.enter)="saveEdit(todo, $event)"
        (blur)="saveEdit(todo, $event)">
    </li>
  </ul>
</section>
<!-- This footer should hidden by default and shown when there are todos -->
<footer class="footer">
  <!-- This should be `0 items left` by default -->
  <span class="todo-count"><strong>{{ remaningCount }}</strong> item left</span>
  <!-- Remove this if you don't implement routing -->
  <ul class="filters">
    <li>
      <a [ngClass]="{
        selected: visibility === 'all'
      }" href="#/">All</a>
    </li>
    <li>
      <a [ngClass]="{
        selected: visibility === 'active'
      }" href="#/active">Active</a>
    </li>
    <li>
      <a [ngClass]="{
        selected: visibility === 'completed'
      }" href="#/completed">Completed</a>
    </li>
  </ul>
  <!-- Hidden if no completed items are left ↓ -->
  <button
    (click)="clearAllDone()"
    class="clear-completed">Clear completed</button>
</footer>
  </ng-template>
  
</section>
<footer class="info">
  <p>Double-click to edit a todo</p>
  <!-- Remove the below line ↓ -->
  <p>Template by <a href="http://sindresorhus.com">Sindre Sorhus</a></p>
  <!-- Change this out with your name and url ↓ -->
  <p>Created by <a href="http://todomvc.com">you</a></p>
  <p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
</footer>

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SELECT 語句 SQL語句是由簡單的英語單詞構成的。這些單詞稱 為關鍵字,每個SQL語句都是由一個或多個關鍵字構成的。大概,最經常 使用的SQL語句就是 SELECT 語句了。它的用途是從一個或多個表中檢索 信息。 為了使用 SELECT 檢索表數據,必須至少給出兩條信息——想選擇什 麽,以及從 ...
  • 連接 在具有可供使用的MySQL DBMS和客戶機軟體之後,有必要簡要討 論一下如何連接到資料庫。 MySQL與所有客戶機 — 伺服器DBMS一樣,要求在能執行命令之前登 錄到DBMS。登錄名可以與網路登錄名不相同(假定你使用網路)。MySQL 在內部保存自己的用戶列表,並且把每個用戶與各種許可權關聯 ...
  • yarn-site.xml 配置介紹yarn.scheduler.minimum-allocation-mb yarn.scheduler.maximum-allocation-mb說明:單個容器可申請的最小與最大記憶體,應用在運行申請記憶體時不能超過最大值,小於最小值則分配最小值,從這個角度看,最小值 ...
  • 什麼是MySQL MySQL已經存在很久了,它在世界範圍內得到了廣泛的安裝和使用。 為什麼有那麼多的公司和開發人員使用MySQL?以下列出其原因。 成本——MySQL是開放源代碼的,一般可以免費使用(甚至可以 免費修改)。 性能——MySQL執行很快(非常快)。 可信賴——某些非常重要和聲望很高的公 ...
  • 什麼是資料庫 資料庫這個術語的用法很多,但就本書而言,資料庫是一個以某種 有組織的方式存儲的數據集合。理解資料庫的一種最簡單的辦法是將其 想象為一個文件櫃。此文件櫃是一個存放數據的物理位置,不管數據是 什麼以及如何組織的 資料庫(database) 保存有組織的數據的容器(通常是一個文 件或一組文件 ...
  • 趕快打開微信開發工具,快速進到項目視窗中。展開pages,展開index,展開logs,展開utils,展開一切可以展開的。唯有如此,方能見到整個項目的全貌。項目中,工程配置文件project.config.json,可用來配置appid、項目名稱、調試基礎庫,還有雲開發的文件夾路徑,至於其他的,幾... ...
  • 圓角矩形介紹 在 中通過 屬性可以實現元素的圓角矩形。 屬性值一共有 個,左上、右上、左下、右下。 屬性值規則如下:第一個值為左上、第二個值為右上、第三個值為左下、第四個值為右下。 假如 屬性值都是一致的我可以設置一個屬性值即可。 圓角矩形實踐 圓角矩形基本使用方式 如果我們的 屬性值一致實踐。 如 ...
  • 起步 下載模板: 初始化項目: 將 文件內容替換如下: 安裝模板依賴的樣式文件: 在 文件中導入樣式文件: 看到如下頁面說明成功。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...