Angular2学习笔记.2、绑定、ngFor和ngIf指令、MVVM分离、DisplayingData

Angular中的结构指令:ngIf和ngFor的使用详解 通过了解和使用ngIf和ngFor这两个常用的Angular结构指令,你可以更好地控制和管理你的应用程序中的DOM元素。这些结构指令为我们提供了灵活的方式来根据条件显示或隐藏元素,以及根据数据集合动态生成重复的元素,从而提高了应用程序的交互性和可扩展性。结构指令是Angular中的一种特殊指令,用于控制DOM元素的显示和隐藏,或者根据数据集合创建重复的DOM元素。其中,最常用的结构指令是ngIf和ngFor。除了基本的ngFor语法之外,我们还可以使用索引,以及为每个重复的元素提供额外的上下文。 阅读详情

本篇概述

本片为Anguar2学习笔记的第二篇文章,将会讲述Angular2的数据绑定功能(仅涉及单向),ngFor、ngIf指令的使用以及如果分离MVVM。
本片内容参照官方文档DisplayingData。
工程演示

工程结构

这次我们来建立一个新的工程DisplayData。
本篇笔记结束后,目录结构应该是这个样子,你不需要提前创建这个目录结构,在需要的时候我会说明。
关于环境搭建和基础目录结构请参照第一篇笔记。

/  
|-package.json  
|-index.html  
|-node_modules/  
  |-libraries  
  |-...  
|-DisplayData/
  |-index.html
  |-app/
    |-DisplayComponent.js
    |-main.js
    |-template/
      |-DisplayData.template

正文

数据绑定(仅涉及单向)

在Angular中,你可以为HTML模板绑定数据,这样Angular就会在数据变化时自动更新UI所显示的内容。
在这个工程中将会创建一个DisplayComponent的组件,这个组件的相关属性会实时的显示在模板上,例如:

DisplayComponent.myName="Alice";
<div>
    {{myName}}
</div>

那么在运行时,<div>中的内容会显示为Alice,当Alice变为Jane时,<div>中的内容也会随之改变。

Directive(指令)

Directive的概念在Angular 1.x就存在了,我对它的认识比较模糊,所以直接通过一些例子来说明。Angular提供的内置执行有很多,这次使用两个:ngFor、ngIf。
先来说说Directive能实现什么,现在我们想在一个页面上显示人名单,人名存在一个数组中。在PHP中我们可能要通过代码控制页面的输出,或者使用模板引擎。在Angular中同样是很方便的,我们可以把这个遍历输出HTML的过程声明式的写入模板中。
例如:

  <ul>
    <li *ngFor="#name of names">
        {{ name }}
    </li>
  </ul>

可以看到<ul>中写入了一个<li>元素,但是这个<li>元素中存在ngFor指令,其含义是将数组names中的每个元素进行遍历,根据name输出多个<li>。
其结果类似:

  <ul>
    <li>
        name1
    </li>
     <li>
        name2
    </li>
     <li>
        name3
    </li>
      <li>
        nameN
    </li>
  </ul>

其中{name}的作用如前面单向绑定中所说,显示为变量name的内容,name依次迭代names中的元素。

ngFor

ngFOr指令为iterable(可迭代的)对象的每一个元素创建一个DOM元素。Angular会自动把你对names数组所做的改动映射到DOM,例如添加、删除、排序。

  <ul>
    <li *ngFor="#name of names">
        {{ name }}
    </li>
  </ul>

‘#name’:通过此变量引用可迭代对象的每一个值。
‘of names’:使用当前控制器(组件)的数组names作为可迭代对象。

此时(2016-2-19)官方文档的此处内容有误,应将*ng-for改为*ngFor,其他大都也试用这个规则,感谢Neil,Wai Ha Lee,Günter Zöchbauer,Mark Rajcok。

ngIf

ngIf指令通过判断你该出的表达式从而添加或删除DOM元素,它同样是实时的。

  <p *ngIf="names.length > 3">
    You have many friends!
  </p>

当names的长度大于3时显示<p>及其内容。

template、component和data的分离

MVVM(与MVC)

Angular采用MVVM架构,关于MVC、MVVM之类的探讨在网络上有很多,但是大多数看完后仍然一头雾水。我大概说一下我的看法供大家参考。
MVC架构将工程分为模型、视图、控制器,他们彼此分离便于调整。C起到MV的粘合剂的作用,它将数据拿出来,整合,并且包含了业务逻辑。MVC架构是对称的,C对MV的作用是同等的,它处在MV的中间。
MVVM就是Model View View-Model,显而易见,C不见了,因为C的作用被改变(或削弱)了。在Angular中主要体现在数据的自动绑定,传统的C不再需要操心如何将数据传送到View中,它主要做好与Model的交互和业务逻辑就好了。如果说MVC是平衡的,现在MVVM重心向M倾斜(这是从开发做所做的工作量来看,实际上它们最后完成了同样的工作,并没有什么区别)。从字面上开,我将VM解释为“view的model”。
在一个博客的场景中:
Model有分类、文章、评论这三个部分。
View有首页、分类页、文章页(评论和文章在一起)。
View-Model根据View有首页、分类页、文章页,但是他们主要由数据和业务逻辑组成,首页VM从M拿过来所有的分类、热门的文章(摘要而不是全文)以及热门评论。分类页VM从Model拿来所有分类,文章页VM拿来某一篇文章的全文、推荐文章的摘要、文章的评论。他们还要负责诸如访问统计、发表删除文章及评论的业务逻辑。他们不用担心和View的交互,因为这变得自动(透明)了。所以说我认为VM是“view的model”,外加业务逻辑。

如何分离
模板文件

如果你不想将template直接写在代码中,那么可以将其单独放入文件:

(function(app){
    app.DisplayComponent = 
    ng.core.Component({
        selector:'display',
        templateUrl:'/DisplayData/app/template/DisplayData.template' 
    })
    .Class({
        constructor:function(friends){}
    });
})(window.app || (window.app = {}));

这类似于第一篇笔记中给介绍Component的内容,不同的是template变成了templateUrl。templateUrl的值为所引用模板文件的URL。

data分离

将Model直接编码在Controller里是不恰当的,我们需要为Model创建一个新的类,并将它注入到控制器中:

function FriendsService() {
  this.names = ["Aarav", "Martín", "Shannon", "Ariana", "Kai"];
}
(function(app){
    app.DisplayComponent = 
    ng.core.Component({
        selector:'display',
        providers: [FriendsService],
        templateUrl:'/DisplayData/app/template/DisplayData.template' 
    })
    .Class({
        constructor:function(friends){
            this.names = friends.names;
        }
    });
    app.DisplayComponent.parameters = [[FriendsService]];
})(window.app || (window.app = {}));

这个Component(作为Controller)没有将数据定义写在Class中,而是放在了外面(或单独的文件中)。在需要创建Component实例的时候将data作为参数传入。
此时(2016-2-19),官方文档中错误的将providers写为appInjector,感谢M.Svrcek,Klas Mellbourn,Mark Rajcok。

构建工程

说了这么多终于可以用于实践了,之前没有创建文件进行实际操作是因为代码要改来改去以说明不同的内容,这样多个版本反而不利于理解,现在我把本文所有内容糅合在一起。
建立/DisplayData/index.html:

<html>
  <head>
    <title>Display Data</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- 1. Load libraries -->
    <!-- IE required polyfill -->
    <script src="/node_modules/es6-shim/es6-shim.min.js"></script>

    <script src="/node_modules/angular2/bundles/angular2-polyfills.js"></script>
    <script src="/node_modules/rxjs/bundles/Rx.umd.js"></script>
    <script src="/node_modules/angular2/bundles/angular2-all.umd.js"></script>

    <!-- 2. Load our 'modules' -->
    <script src='/DisplayData/app/DisplayComponent.js'></script>
    <script src='/DisplayData/app/main.js'></script>

  </head>

  <!-- 3. Display the application -->
  <body>
    <display>Loading...</display>
  </body>

</html>

建立/DisplayData/app/DisplayComponent.js:

function FriendsService() {
  this.names = ["Aarav", "Martín", "Shannon", "Ariana", "Kai"];
}
(function(app){

    app.DisplayComponent = 
    ng.core.Component({
        selector:'display',
        providers: [FriendsService],
        templateUrl:'/DisplayData/app/template/DisplayData.template' 
    })
    .Class({
        constructor:function(friends){
            this.myName="Alice";
            this.names = friends.names;
        }
    });
    app.DisplayComponent.parameters = [[FriendsService]];
})(window.app || (window.app = {}));

建立/DisplayData/app/main.js:

(function(app){
    document.addEventListener('DOMContentLoaded',function(){
        ng.platform.browser.bootstrap(app.DisplayComponent);
    });
})(window.app || (window.app = {}));

建立/DisplayData/app/template/DisplayData.template:

<p>My name: {{ myName }}</p>
<p>Friends:</p>
<ul>
    <li *ngFor="#name of names">
        {{ name }}
    </li>
</ul>
<p *ngIf="names.length > 3">You have many friends!</p>

在/下执行npm start。
在这个工程中我没有手动创建DisplayComponent的实例,Angular将在DOM和你定义的类结合的时候自动创建相关实例并将属性和模板绑定。

告别Vivado自带编辑器!手把手教你用Sublime Text 4 + Icarus Verilog搭建FPGA开发环境(Windows 10/11) 本文详细介绍如何在Windows 10/11系统下,使用Sublime Text 4和Icarus Verilog搭建高效的FPGA开发环境,替代Vivado自带编辑器。通过配置语法检查、代码高亮和智能补全等功能,提升Verilog开发效率,实现专业级工作流。 阅读详情

相关推荐

10-Oracle 23 ai Vector Search 概述和参数

企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation :RAG)功能,RAG能够将LLM的生成能力与知识库的精准资料库进行检索结合,将大模型部署在内部同时将私有的数据进行LLM的检索避免泄露企业专用的数据同时提高的准确性。于是如何将数据存入向量数据库以及向量查询等这些基本功能变得必备和重要。

远方的专栏 1294

技术宅小伙:Angular入门 - ngIf和ngFor介绍

以上就是管道的一个最基本的用法。这个例子中,我们只是展示了一个非常简单的使用方法,实际上,管道的功能非常强大,我们可以通过自定义管道来实现更加复杂的转换功能。这个例子中,我们只是展示了一个非常简单的使用方法,实际上,管道的功能非常强大,我们可以通过自定义管道来实现更加复杂的转换功能。里面加一个变量来获取当前item的索引,然后我们在这里判断就是如果这个索引是偶数的话,我们就去展示这个item。里面加一个变量来获取当前item的索引,然后我们在这里判断就是如果这个索引是偶数的话,我们就去展示这个item。

2301_76992670的博客 1265

MATLAB MinGW-w64 C/C++ 编译器 手动安装配置

根据Matlab版本与MinGW版本对应关系,手动安装、配置并测试MinGW

zjh2883的博客 7342

Angular中ngfor与ngif的嵌套使用

ng2 结构指令不能直接嵌套使用,可以通过使用标签来包裹指令,两个结构指令分开放在两个标签中,解决冲突。 <ul *ngFor="let value of item; let key = index"> <li *ngIf="value.isShow">{{value.name}}</li> </ul> ...

qq_37609418的博客 1169

一篇讲透:豆包、元宝、DeepSeek、Kimi、WorkBuddy,职场里到底怎么分工

这篇文章深入分析了当前主流AI工具(WorkBuddy、豆包、腾讯元宝、DeepSeek、Kimi)的特点和使用场景,帮助读者根据不同工作需求选择合适的AI助手。核心观点包括: AI工具各有所长:豆包适合快速创作初稿,元宝擅长信息检索整理,DeepSeek强于逻辑分析,Kimi专精文本处理,WorkBuddy则更适合任务推进和成果交付。 使用前需明确需求:是要创意发散、信息整理,还是任务执行?不同阶段应选用不同工具组合。 提供了6个具体职场场景的解决方案,包括文章创作、课程设计、会议纪要等,并给出详细的操作

weixin_39284145的博客 1万+

【博弈论】势博弈(potential game)、EPG以及最佳响应、Nash均衡和帕累托(pareto)最优的理解

文章目录前言一、Potential game二、Nash均衡和Pareto-optimal(帕累托最优)1.Nash 均衡2.Pareto最优三、Best response(最佳响应)四、Exact potential game(EPG)1.合作-傀儡博弈2.合作博弈3.傀儡博弈4.自激博弈5.双边对称交互博弈使用理解 前言 本文主要详细讲解potential game的概念以及Exact potential game 的定义和分类,以及这么博弈方法是如何在论文中引入并使用的,本文仅是对自己在该模块

weixin_44535200的博客 2万+

ngFor ngIf

angular2中,ngFor和ngIf 一起使用&lt;ng-container *ngIf="show"&gt; &lt;div *ngFor="let thing of stuff"&gt; {{log(thing)}} &lt;span&gt;{{thing.name}}&lt;/span&gt; &lt;/div&gt; &lt;/ng-conta

Litwak 1070

如何搭建pikachu靶场

Pikachu靶场本地搭建指南 下载安装PHPStudy并启动Apache/MySQL服务 获取Pikachu靶场源码并解压到网站根目录 配置数据库连接信息(修改config.inc.php文件) 创建pikachu数据库(用户名/密码设为root) 访问http://localhost/pikachu测试功能 常见问题:数据库连接失败需检查服务状态和配置信息,页面报错需检查PHP版本兼容性。建议使用PHP7.3/7.4版本,在隔离环境中搭建使用。 (150字)

2401_85351702的博客 1276

angular2--常用标签[(ngModel)]、*ngFor、*ngIf等等

常用标签 一、跳转事件 html: &amp;amp;amp;lt;div (click)=&amp;amp;quot;goPage('prevPage')&amp;amp;quot;&amp;amp;amp;gt;&amp;amp;amp;lt;/div&amp;amp;amp;gt; //跳转到上一页 &amp;amp;amp;lt;div (click)=&amp;amp;quot;goPage('nextPage')&amp

Ariel的博客 1947

分布式 Agent 系统设计:高并发场景下的挑战与解决方案

分布式 Agent 系统由多个分布在不同节点上的智能 Agent 组成,这些 Agent 具有自主决策能力,能够通过通信协作完成复杂任务。每个 Agent 可以看作是一个独立的实体,具备感知环境、处理信息、执行动作的功能,它们相互协作,共同实现系统的整体目标。分布式 Agent 系统在高并发场景下面临着资源调度、通信延迟、状态一致性、容错处理和性能瓶颈等诸多挑战。通过采用动态资源分配、高效通信协议、分布式共识算法、冗余备份等解决方案,可以有效应对这些挑战,提高系统的性能、可靠性和可用性。

shuizhudan223的博客 1292

最新Python爬虫实战(入门爬虫篇)——案例3:爬取二次元cos图片批量下载到本地(附上完整爬虫代码)

本次案例通过Python爬虫技术实现了二次元图片的批量下载。代码采用模块化设计,函数实现cookies的自动解析,简化了配置流程,涵盖“请求列表页→提取详情页URL→请求详情页→提取图片链接→保存图片”的完整流程,与豆瓣案例的核心逻辑和格式完全对齐。学习重点包括:抓包工具定位多层级数据源、正则表达式匹配复杂链接、模拟请求头绕过反爬机制、文件名安全处理及自动化文件管理。需要注意控制请求频率并遵守网站使用规范,适用于入门爬虫实践,帮助学习者掌握多层级页面爬取的核心逻辑。

努力让自己发光,对的人才能迎着光而来 14万+

angular5:*ngIf与*ngFor的使用指南与技巧

这段时间对于ngIf与ngfor的使用变得多样化,也解决了一些原本写代码的痛点.得以喘息机会,细细总结一下. ngIf与ngFor在angular里被称为是结构型指令.所谓结构型指令,就是它能够塑造或重塑DOM的结构. 说句话就是在渲染的时候它能够帮你增加,删除,维护这些元素. *ngIf 学过vue的话,就知道ngIf与v-if是一样的.就是将元素从DOM树移除,或者是不加载. <di...

前端小白 1万+

手把手教你用Pytorch代码实现Transformer模型(超详细的代码解读)

本文整理了非常清楚的Transformer模型结构图,建议大家在看代码的时候能结合这个结构图来理解,这样理解起来会比较容易! 用Pytorch实现Transformer的完整代码

捡起一束光的博客 7万+

ngfor ngif(ngif then else) ngswitch + ngfor里面使用ngif 和 ngswitch

<div *ngIf="col.field=='useSubsidy'; then thenBlock else elseBlock " ></div> <ng-template #thenBlock> {{carData.useSubsidy|USE_SUBSIDY_PIP}} </ng-template> <ng-template...

weixin_41147129的博客 1309

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

angular之绑定图片,ngFor、ngIf、ngswitch、ngclass、事件、双向绑定等

当我们使用vsCode想要更换新的组件的时候,找到app下面的这个: 然后输入新的组件的名字,就可以运行新的组件了。 目录 一、绑定图片 二、循环数据如何显示索引值 三、条件判断ngIf 四、条件判断ngSwitch 五、ngClass用法 六、事件 七、双向绑定 一、绑定图片 1、如果想要绑定本地图片,根目录下面找到assets,然后新建一个images的文件...

aaaPostcard的博客 1757

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ng-if指令

一、定义和用法 ng-if指令用于在表达式为false时移除html元素。 如果if语句执行结果为true,会添加移除元素,并显示。 ng-if指令不同于ng-hide,ng-hide隐藏元素,而ng-if是从DOM中移除元素。 语法: 参数值 值 描述 expression 如果表达式返回 false 则会移除整个元素,如果为 tru

天马3798 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

[Angular] 笔记 3:ngIf

表达式求值为 truthy 时,Angular会渲染在then子句中提供的模板;当为falsy 时,Angular会渲染在可选的。,属性绑定是单向数据流,将数据放到web页面上。是 Angular 的行为指令。元素使用了属性绑定和事件绑定。,事件向上传递,数据向下流动。

学习笔记 1049

Angular ngIf ngSwitch ngForOf

ngIf、ngSwitch、ngForOf 这一节,我们将介绍angular内置指令:ngIf、ngSwitch、ngForOf。这也是日常开发中经常会遇到的常见指令。原文阅读 ngIf ngIf是内置的结构型指令,控制宿主元素的添加或删除,取决于绑定的值是否为真。(跟vue的v-if是类似的,不是控制display属性) 单独使用ngIf import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app

yanyi24的博客 1529

AngularJS ng-if使用

ng-if指令不同于ng-hide,ng-hide隐藏元素,而ng-if是从DOM中移除元素。如果if语句执行结果为true,会添加元素,并显示。ng-if指令用于在表达式为false时。

我的博客 861

ngIf和ngFor共用

Angular v2不支持同一元素上的多个结构指令。 作为一种解决方法,使用&lt;ng-container&gt;允许您为每个结构指令使用单独元素的元素,但不会将其标记为DOM。 &lt;ng-container *ngIf="show"&gt; &lt;div *ngFor="let thing of stuff"&gt; {{log(thing)}} &lt;span...

like419的博客 3982

请说说在Angular中的ngIf是什么?有哪些用途?

是一个结构型指令,它用于在DOM中添加或移除元素。这个指令的工作方式是,基于一个条件表达式的结果来决定是否显示或隐藏一个元素。如果条件为真,则对应的元素会被添加到DOM中;如果条件为假,元素则会被从DOM中移除。是Angular中非常强大和灵活的一个指令,它可以根据你的需要动态地控制DOM元素的显示和隐藏,从而提供更好的用户体验并优化应用的性能。在Angular中,

王铁柱666的博客 501

angular内置指令

2022.4.1 常用angular内置指令 1.ngModel 这个指令就是实现数据绑定的,不过有三种写法和意思 第一种—— ngModel : html: <input type="text" ngModel="msg" name="msg" /> ts: msg: any = 'I m MSG'; 这中直接使用的方式意味着不是绑定到在ts中定义的 msg的值,而是在前台直接赋值给当前使用 ngModel指令的元素。 未改变前 添加了点击事件,点击后会改变ts中msg的初始值,

hzqzzz的博客 1557

angular2的ngfor和ngif指令嵌套

ng2 结构指令不能直接嵌套使用,可使用标签来包裹指令示例如下<ul> <ng-container *ngFor="let item of lists"> <div class="thumb p-date" *ngIf="item.picurl"> <a href="# "><img src="{{item.picurl}} " alt=" " style="width:79px;height: 7

东黧的博客 8677

angular2的ngfor ngif指令嵌套

ng2 结构指令不能直接嵌套使用,可使用标签来包裹指令 示例如下: ul> ng-container *ngFor="let item of lists"> div class="thumb p-date" *ngIf="item.picurl"> a href="# ">img src="{{item.picurl}} " alt=" " style="width:79px;heig

pht1991的博客 3586

*ngFor 和 *ngIf 不能放置在同一个标签上

摘自:https://www.jianshu.com/p/ff3237a3e7dd 用 ngIf 指令来晒男性英雄 &lt;ion-list&gt; &lt;ng-container *ngFor="let item of data"&gt; &lt;ion-item *ngIf="item.gender===1"&gt; &lt;ion-avatar ...

chelen_jak的专栏 6366

*ngFor 和 * ngIf

*ngFor 中不能使用 *ngIf 语句,请道友们自行修炼,有别的结论的欢迎留言

fdsjiaoDoctor的博客 2163
上一篇: Angular2学习笔记.1、环境部署,基本概念,HelloAngular2
下一篇: Angular2学习笔记.3、通过模板调用Controller事件实现用户输入和显示,UserInput
若简LL
博客等级 码龄11年 8粉丝 12原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值