当前位置: 首页 > 编程日记 > 正文

angularJS中directive与controller之间的通信

当我们在angularJS中自定义了directive之后需要和controller进行通讯的时候,是怎么样进行通讯呢?

这里介绍3种angular自定义directive与controller通信的指令。

1.指令作用域中的"@"

作用:把当前属性作为字符串传递实现指令与html页面元素关联。

<!DOCTYPE html>
<html ng-app="demoapp">
<head lang="en"><meta charset="UTF-8"><title>angular-directive与controller通信</title><script src="js/angularjs1.4/angular-1.4.6.mini.js"></script>
</head>
<body><div ng-controller="democtrl2"><!--给tag2赋值的时候要使用表达式--><mytag tag2="{{attrd}}"></mytag></div></body>
</html>
<script>var demoapp = angular.module('demoapp', []);demoapp.controller('democtrl2', ['$scope', function($scope) {$scope.attrd = 'hello';}]);//scope中tag2属性值为"@",将tag2作为字符串传递与页面中html实现关联demoapp.directive('mytag', function() {return {restrict:"AE",scope:{tag2:'@'},template:"<div>{{tag2}}</div>"};});</script>

这里首先在html页面中定义了<mytag></mytag>标签,然后定义tag2属性,然后将在controller中定义的attrd属性赋值给标签中的tag2属性。

然后在js中定义了一个mytag的一个指令,在scope中tag2属性值为"@",这样的话tag2的值就是页面中tag2={{attrd}}中的值,而attrd=“hello”。所以tag2=“hello”。其主要的作用是将<mytag></mytag>标签替换为template中的<div>{{tag2}}</div>。

其实等价于:

1 link:function(scope, element, attrs) {//scope为父controller中的scope,element为mytag,attrs为mytag中的属性2     scope.tag2 = attrs.tag2;  
3 }

其主要的流程是:

1.通过@实现指令与html页面元素进行关联。

2.在控制器中又实现了与页面的关联。

3.通过html实现了控制器和指令之间的联系。

2.指令作用域中的"="

作用:表示与父scope中的属性进行双向数据绑定

<!DOCTYPE html>
<html ng-app="demoapp">
<head lang="en"><meta charset="UTF-8"><title>angular-directive与controller通信</title><script src="js/angularjs1.4/angular-1.4.6.mini.js"></script>
</head>
<body>
<div ng-controller="democtrl2">Ctrl:<input type="text" ng-model="attrd2"/><br/>
    Directive:<mytag2 tag3="attrd2"></mytag2>
</div>
</body>
</html>
var demoapp = angular.module('demoapp', []);demoapp.controller('democtrl2', ['$scope', function($scope) {$scope.attrd2 = 'hello2';}]);
demoapp.directive('mytag2', function() {return {restrict:"AE",scope:{tag3:"="},template:"<input type='text' ng-model='tag3' />"};});

具体流程:

1.在html中定义了一个输入框ng-model绑定了controller中的attrd2,同时定义<mytag2></mytag2>标签,然后将controller中的attrd2赋值给tag3。

2.在指令中scope对象中tag3:"=",则表示与父scope中的属性进行双向数据绑定,具体绑定哪个mytag2标签中已经指定了。然后替换为tamplate中的标签显示。

3.通过"="实现了指定中的属性与父scope中的属性进行双向数据绑定,从而当改变一个值时达到互相影响对方的作用。

3.指令作用域中的"&"

作用:表示与父scope中的函数进行传递,稍后进行调用。

<!DOCTYPE html>
<html ng-app="demoapp">
<head lang="en"><meta charset="UTF-8"><title>angular-directive与controller通信</title><script src="js/angularjs1.4/angular-1.4.6.mini.js"></script>
</head>
<body>
<div ng-controller="democtrl2"><mytag3 tagfn="attrd_fn(name)"></mytag3><span>{{fruit}}</span></div>
</body>
</html>
var demoapp = angular.module('demoapp', []);demoapp.controller('democtrl2', ['$scope', function($scope) {//方法传入参数的名称和下面自定义的directive中对象的属性名称要一致$scope.attrd_fn = function(name) {$scope.fruit = name;}}]);demoapp.directive('mytag3', function() {return {restrict:"AE",scope:{tagfn:"&" //属性不能有下划线
                },template:"<input type='text' ng-model='fruitname'/><button ng-click='tagfn({name:fruitname})'>水果名字</button>" //对象传入的属性名称和controller中方法传入的参数名称一致
};});

具体流程:

1.页面中定义了<mytag3></mytag3>标签,标签中tagfn属性等于controller中定义的attrd_fn函数。

2.自定义mytag3指令中tagfn:"&"则表示directive与controller之间主要进行的是函数的传递。同时将页面上的标签替换为template中的内容。

3.通过页面中tagfn="attrd_fn(name)",template中ng-click时触发的tagfn函数来自controller中的attrd_fn;同时tagfn函数传入的是一个对象,对象的属性名字要和controller中attrd_fn函数中参数名字一致。

为达到简洁的效果我将页面的显示结果放到了一张图片展示,如下:

转载于:https://www.cnblogs.com/guozhe/p/7650904.html

相关文章:

Eclipse启动失败:No java virtual machine was found after searching the follwing locations

Eclipse启动失败&#xff0c;错误信息如下如所示&#xff1a; 通过阅读错误信息&#xff0c;可以看到错误原因和 javaw.exe路径 有关&#xff1b; 打开eclipse.ini文件&#xff0c;也就是启动Eclipse的初始化文件&#xff1a; 在本地计算机中找到jdk安装路径下javaw.exe文件&a…

Cisco路由器安全配置必用10条命令

当谈到配置一台新的cisco路由器&#xff0c;多数配置依赖于路由器的类型以及它将服务的用途。然而&#xff0c;每位管理员都有其自己的“正确”配置每台路由器的命令列表。笔者将和你分享他自己配置路由器的十条命令列表。<?xml:namespace prefix o ns "urn:schemas…

Tensorflow学习教程------模型参数和网络结构保存且载入,输入一张手写数字图片判断是几...

首先是模型参数和网络结构的保存 #coding:utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_datamnist input_data.read_data_sets(MNIST_data,one_hotTrue) #每个批次的大小 batch_size 100 n_batch mnist.train._num_examples // ba…

IntelliJ IDEA乱码问题解决方法

目录 1、设置文件编码 2、设置控制台编码 3、设置Tomcat Server编码 4、修改配置文件编码内容 1、设置文件编码 第1步&#xff1a;打开IDEA&#xff0c;依次点击File、Settings... 打开Setting窗口&#xff1b; 第2步&#xff1a;在Settings窗口中&#xff0c;依次点击Ed…

Windows 7的CMD中 Telnet 无法执行的解决办法

在Windows 7的CMD中&#xff0c;执行telnet 192.168.1.10 80 会提示没有这个命令的提示&#xff0c;这是因为Win7默认是没有安装Telnet的&#xff08;在以往的WINDOWS系统中都是默认安装的&#xff09;。解决办法&#xff1a;在Win7中&#xff0c;进入控制面板&#xff0c;然后…

Qt——模态、非模态

模态&#xff1a; 只能操作对话框非模态&#xff1a;要使用 QDialog *_d new QDialog();_d->setattribute(Qt::WA_DeleteOnClose);_d->show();转载于:https://www.cnblogs.com/yangxinrui/p/10515249.html

c# 取两个时间的间隔

c#可以取两个时间的年月日时分秒之间的间隔&#xff0c;不受跨年月的影响。声明一个 TimeSpan System.TimeSpan ts dtNightEnd.Subtract(dtAmStart); dtNightEnd是原始时间 减去 dtAmStart 这个时间 获得一个TimeSpan TimeSpan 自带了间隔属性 ts.Days.ToString(); ts.Hours.…

MySQL数据表命令

显示表的相关信息&#xff1a; show table status like "表名"&#xff1b; show table status like "表名" \G 格式化&#xff0c;以记录条目形式显示&#xff0c;更清晰 注意&#xff1a;\G后面不能加分号&#xff0c;不然会出现查询错误。因为\G在…

undefined reference to 'pthread_create'问题解决(转)

undefined reference to pthread_createundefined reference to pthread_join问题原因&#xff1a;pthread 库不是 Linux 系统默认的库&#xff0c;连接时需要使用静态库 libpthread.a&#xff0c;所以在使用pthread_create()创建线程&#xff0c;以及调用 pthread_atfork()函数…

C语言程序设计第一次作业

&#xff08;一&#xff09;实验总结 1.圆的面积和周长问题 &#xff08;1&#xff09;题目&#xff1a; 输入圆的半径&#xff0c;计算圆的周长和面积。 &#xff08;2&#xff09;流程图 &#xff08;3&#xff09;测试数据及运行结果 &#xff08;4&#xff09;实验分析 问题…

U盘中毒,无法删除System Volume Information文件夹

情景&#xff1a;U盘中毒&#xff0c;U盘内的文件夹名称变成.exe后缀&#xff0c;且多出一个名为System Volume Information的文件夹&#xff0c;对U盘进行格式化后&#xff0c;所有文件消失&#xff0c;当拔出U盘&#xff0c;再次插入电脑时&#xff0c;发现System Volume Inf…

用Javascript修正12个常见的浏览器问题

我们提倡尽可能使用CSS&#xff0c;而且我们常常能做到这一点。现代浏览器有很好的CSS支持-这无疑足够好让你使用CSS来控制布局和版面设计。但是有时候&#xff0c;某些网页元素在不同的浏览器会出现不同。 如果你不知道原因&#xff0c;不要过于担心&#xff0c;请研究CSS规则…

读书笔记之知识杂点

1.xx1,x1,x,哪个效率最高?为什么? xx1最低&#xff0c;因为它的执行过程如下&#xff1a; &#xff08;1&#xff09;读取右x的地址 &#xff08;2&#xff09;x1 &#xff08;3&#xff09;读取左x的地址 &#xff08;4&#xff09;将右值传给左边的x(编译器并不认为左右的x…

Codeforces.487C.Prefix Product Sequence(构造)

题目链接 \(Description\) 对于一个序列\(a_i\)&#xff0c;定义其前缀积序列为\(a_1\ \mathbb{mod}\ n,\ (a_1a_2)\ \mathbb{mod}\ n,...,(a_1a_2...a_n)\ \mathbb{mod}\ n\)。 给定\(n\)&#xff0c;求一个\(n\)的排列&#xff0c;使得该排列的前缀积序列是\([0,1,2,...,n-1]…

读取CSV文件内容,将其转换成JSON字符串输出

CsvToJsonUtil 工具类作用&#xff1a;读取CSV文件内容&#xff0c;将其转换成JSON字符串输出 转换工具类代码如下&#xff1a; package com.test.util;import java.io.*; import java.io.IOException;public class CsvToJsonUtil {/*** 根据文件路径读取CSV文件 返回String字…

component-scan和annotation-driven

<context:component-scan/>该xml配置作用是启动Spring的组件扫描功能&#xff0c;自动扫描base-package指定的包及其子文件下的java文件&#xff0c;如果扫描到有controller、Service、Repository、Component等注解的java类&#xff0c;就会将这些类注册为bean。指定的包…

“不亦乐乎”是“乐”还是“悦”?

看了六七年的《咬文嚼字》&#xff0c;在2009年的第一期第一次对其内容产生了巨大的质疑。这是《咬文嚼字》2009年第一期特稿&#xff1a;“《2008年十大语文差错》”&#xff0c;里面公布了《咬文嚼字》编辑部总结的2008年度十大语文差错&#xff1a;  一、“有朋自远方来&a…

mysql 数据操作 单表查询 where约束 between and or

WHERE约束 where字句中可以使用&#xff1a; 比较运算符&#xff1a;>< > < !between 80 and 100 值在80到100之间 >80 <100in(80,90,100) 值是80或90或100 满足这个条件就可以like egon%pattern可以是%或_&#xff0c;%表示任意多字符_表示一个字符…

查看计算机连接的WIFI密码

方法1&#xff1a;通过cmd命令获取 使用WinR组合键&#xff0c;打开命令提示符窗口&#xff0c;输入以下命令&#xff1a; netsh wlan show profiles WIFI名称 keyclear 或者 netsh wlan show profiles name"WIFI名称" keyclear 在输出的内容中&#xff0c;安全…

[VBScript] 自动删除2小时以前生成的文件

保存为deleteTempFiles.vbs&#xff0c;双击即可运行 dim folder, file, mFSO, subfolderSet mFSO CreateObject("Scripting.FileSystemObject") set foldermFSO.GetFolder("C:\Users\msautotestuser\AppData\Local\Temp") Delete files dim df For Each …

超市购物打印小票的简单程序 记录下来

做了2个版本的超市购物小票打印程序&#xff0c;做过记录一、C/S样图如下&#xff1a;其中 输入商品的编码 回车 将会调用该商品的信息&#xff0c;显示在下面的DataGridView中 ,DataGridView中数量是可以修改的&#xff0c;修改数量&#xff0c;下面的合计 将会自动计算 &…

Asp.net控件开发学习笔记(三)-控件开发基础

封装 在asp.net中&#xff0c;控件被分为两类.用户控件和自定义服务器控件。前者就是我们经常用来将一些可复用的内容封装成的.ascx文件。这里主要研究后者. 创建自定义服务器控件 创建自定义控件的第一步是选择以哪一个类作为基类来创建控件&#xff0c;Asp.net最常见的几个基…

Codeforces Round #447 (Div. 2) B. Ralph And His Magic Field 数学

题目链接 题意&#xff1a;给你三个数n,m,k;让你构造出一个nm的矩阵&#xff0c;矩阵元素只有两个值&#xff08;1&#xff0c;-1),且满足每行每列的乘积为k&#xff0c;问你多少个矩阵。 解法&#xff1a;首先&#xff0c;如果n&#xff0c;m奇偶不同&#xff0c;且k-1时&…

剑指offer三十六之两个链表的第一个公共结点

一、题目 输入两个链表&#xff0c;找出它们的第一个公共结点。 二、思路 如果存在共同节点的话&#xff0c;那么从该节点&#xff0c;两个链表之后的元素都是相同的。也就是说两个链表从尾部往前到某个点&#xff0c;节点都是一样的。我们可以用两个栈分别来装这两条链表。一个…

Oracle数据库相关命令

从cmd窗口进入SQL命令行 sqlplus / as sysdba; 查询所有用户 &#xff08;1&#xff09;使用具有DBA权限的账号登录数据库。 &#xff08;2&#xff09;执行如下命令。 SQL> select username from dba_users; -- 或者使用如下语句 SQL> select * from all_users; 创…

实时传输协议(RTP)

RTP简介 RTP是一种提供端对端传输服务的实时传输协议&#xff0c;用来支持在单目标广播和多目标广播网络服务中传输实时数据&#xff0c;而实时数据的传输则由RTCP协议来监视和控制。 RTP定义在RFC 使用RTP协议的应用程序运行在RTP之上&#xff0c;而执行RTP的程序运行在UDP…

Windows LTSC、LTSB、Server 安装 Windows Store 应用商店

下载安装包 打开网址 https://store.rg-adguard.net/ 以 PackageFamilyName 方式搜索 Microsoft.WindowsStore_8wekyb3d8bbwe 根据系统选择对应的包&#xff0c;每一种都要下载 安装 在下载目录按住 shift 键&#xff0c;然后鼠标右键&#xff0c;打开 Powershell 执行安装命令…

sybase Invalid command line argument 'and'.

解决方法&#xff1a; 先到sybase central安装目录下&#xff08;我这里是&#xff1a;C:\sybase\ASE-12_0\bin\syconfig.exe&#xff09;双击看能不能正常运行。如果可以&#xff0c;就证明是开始菜单里的“配置服务器”的快捷方式有问题&#xff1b; 然后删除开始菜单里面“配…

Jmeter调试工具---Debug Sampler

使用场景&#xff1a;脚本开发是&#xff0c;调试用&#xff08;正式测试时需删除&#xff09;&#xff0c;Debug Sampler会把我们自定义的变量输出在response data中 使用设置&#xff1a;JMeter properties和System properties通常都选false&#xff0c;这两个就是JMeter和系…

Cannot resolve method 'getParameter( )'

在JSP页面中&#xff0c;getParameter 和 setAttribute 显示红色&#xff0c;IDEA的提示信息为&#xff1a; Cannot resolve method getParameter(...) 和 Cannot resolve method setAttribute(...) 原因是缺少servlet-api.jar和jsp-api.jar这两个jar包。 将这两个jar包导入项…