就我对directive的粗浅理解,它一般用于独立Dom元素的封装,应用场合为控件重用和逻辑模块分离。后者我暂时没接触,但数据交互部分却是一样的。所以举几个前者的例子,以备以后忘记。

directive本身的作用域$scope可以选择是否封闭,不封闭则和其controller共用一个作用域$scope。例子如下:
<body ng-app="myApp" ng-controller="myCtrl">
<test-directive></test-directive>
<script>
angular.module("myApp",[])
.controller("myCtrl",function($scope){
$scope.data = {
name:"白衣如花"
};
})
.directive("testDirective",function(){
return {
restrict:"E",
template:"<h1>{{data.name||'未定义'}}</h1>"
}
});
</script>
</body>
显示结果为:白衣如花,可以知道directive中的data.name就是myCtrl控制器中的$scope.data.name。
那么封闭的directive呢?怎么封闭,封闭效果是什么样的,封闭后怎么数据交互?这些都是我这几天摸索的东西。
<body ng-app="myApp" ng-controller="myCtrl">
<test-directive></test-directive>
<script>
angular.module("myApp",[])
.controller("myCtrl",function($scope){
$scope.data = {
name:"白衣如花"
};
})
.directive("testDirective",function(){
return {
restrict:"E",
scope: {},
template:"<h1>{{data.name||'未定义'}}</h1>"
}
});
</script>
</body>
结果显示为:未定义。所以在directive定义时,添加属性scope就可以把directive的作用域和父控制器的作用域分离开来。
好,了解了开放和封闭之后,进入主题,如何进行数据交互。个人觉得数据交互分为:父控制器获取directive的变量;directive获取父控制器的变量;父控制器调用directive的函数;directive调用父控制器的函数。
1.父控制器获取directive的变量。比如封装了一个输入框接受用户输入,父控制器点击搜索按钮要获取用户输入:
<body ng-app="myApp" ng-controller="myCtrl">
<p>名字:{{outerName}}</p>
<test-directive inner-name="outerName"></test-directive>
<script>
angular.module("myApp",[])
.controller("myCtrl",function($scope){
})
.directive("testDirective",function(){
return {
restrict:"E",
scope: {
innerName: "="
},
template:"<input type='text' ng-model='innerName' placeholder='白衣如花'>"
}
});
</script>
</body>
显示结果如下:
分析:从数据流向说起,testDirective中的一个input输入绑定在innerName中,innerName是directive私有作用域拥有的变量,外部控制器不能直接用。通过innerName: "="传递给html中的inner-name属性,
而inner-name属性则绑定在外部控制器的outerName变量中,所以最后显示在最上面的<p>标签内。上述代码等价于如下代码:
<test-directive name="outerName"></test-directive>
scope: {
innerName: "=name"
},
由inerName: "="变成了innerName: "=name",而html属性绑定也由inner-name变成了name。
2.directive获取父控制器的变量。这个应用场合应该挺多的,比如公共的页眉页脚,公共的展示面板等。
这个用上面例子的"="一样可以实现,于是我们知道了"="是双向绑定。但是我们要防止directive内部意外修改数据该怎么办呢?于是单向绑定"@"就出场了。
<body ng-app="myApp" ng-controller="myCtrl">
<input type='text' ng-model='outerName' placeholder='白衣如花'>
<test-directive inner-name="{{outerName}}"></test-directive>
<script>
angular.module("myApp",[])
.controller("myCtrl",function($scope){
})
.directive("testDirective",function(){
return {
restrict:"E",
scope: {
innerName: "@"
},
template:"<p>名字:{{innerName}}</p>" +
"<button ng-click='innerName=innerName+1'>点击</button>"
}
});
</script>
</body>
值得注意的是:@在html的属性绑定时需要{{}}开标识,而=则不用。我的理解是,对于父控制器而言,@是数据传递,而=是数据绑定,所以有这些区别。directive中加入了一个按钮用于验证修改数据后
父控制器是否发生改变,结果是=有变化,@无变化,很容易得出结论:=是双向绑定,@是双向绑定。
3.directive调用父控制器的函数。应用场合,暂时想不到(汗)。
变量用=和@来传递,函数则用&。例子如下:
<body ng-app="myApp" ng-controller="myCtrl">
<p>名字:{{outerName}}</p>
<test-directive on-click="click(name)"></test-directive>
<script>
angular.module("myApp",[])
.controller("myCtrl",function($scope){
$scope.click = function (name) {
$scope.outerName = name || "白衣如花";
}
})
.directive("testDirective",function(){
return {
restrict:"E",
scope: {
onClick: "&"
},
template:"<input type='text' ng-model='innerName' placeholder='白衣如花'>" +
"<button ng-click='onClick({name: innerName})'>点击</button>"
}
});
</script>
</body>
数据传递流程和之上的例子差不多,唯一要注意的是参数传递时,{name: innerName}前者是形参,后者是实参。多个参数时,参数顺序不重要,形参一一对应。
4.父控制器调用directive的函数。这个是前段时间遇到的难点,情况较其他复杂一些。应用场合也很普遍,比如初始化,重置等。
<body ng-app="myApp" ng-controller="myCtrl">
<button ng-click="click()">重置</button>
<test-directive action="action"></test-directive>
<script>
angular.module("myApp",[])
.controller("myCtrl",function($scope){
$scope.action = {};
$scope.click = function () {
$scope.action.reset();
}
})
.directive("testDirective",function(){
return {
restrict:"E",
scope: {
action: "="
},
template:"<input type='text' ng-model='name' placeholder='白衣如花'>",
controller: function ($scope) {
$scope.action.reset = function () {
$scope.name = "白衣如花"
}
}
}
});
</script>
</body>
又一次用到了=,利用了js中函数也是属性的原理。似乎,理解了=的双向绑定,就很容易调用directive内部函数了。但是初始化呢?
首先想到的是类似的=来引用传递:
<body ng-app="myApp" ng-controller="myCtrl">
<test-directive action="action"></test-directive>
<script>
angular.module("myApp",[])
.controller("myCtrl",function($scope){
$scope.action = {};
$scope.action.init();
})
.directive("testDirective",function(){
return {
restrict:"E",
scope: {
action: "="
},
template:"<input type='text' ng-model='name' placeholder='白衣如花'>",
controller: function ($scope) {
$scope.action.init = function () {
$scope.name = "白衣如花"
}
}
}
});
</script>
</body>
但是运行却发现,错误显示$scope.action.init is not a function,看提示应该是运行到第7行的时候,$scope.action.init函数还未定义。怎么办呢?把directive提到controller之前试试?一样是错误。
嗯,可以不用函数,直接在directive的controller中执行$scope.name = "白衣如花",似乎很完美,但如果是有参数的初始化呢?事实上js分离后,我遇到的问题是根据http请求的返回结果来初始化directive,由于
网络快慢不一定,导致控件初始化时不一定有http请求的返回(没有有效的初始化参数),也不能保证http请求返回后directive已经初始化(不能用=来进行函数调用)。
需求很明了了,如果能监控参数变化,再执行初始化,此时能保证directive已经加载,而且有有效的参数。正好angularjs提供了$watch。代码如下:
<body ng-app="myApp" ng-controller="myCtrl">
<test-directive action="action"></test-directive>
<script>
angular.module("myApp",[])
.controller("myCtrl",function($scope){
$scope.action = {name: "白衣如花"};
})
.directive("testDirective",function(){
return {
restrict:"E",
scope: {
action: "="
},
template:"<input type='text' ng-model='name' placeholder='白衣如花'>",
link: function (scope, elem, attrs) {
scope.$watch(attrs.action, function (value) {
scope.action.init();
})
},
controller: function ($scope) {
$scope.action.init = function () {
$scope.name = $scope.action.name
}
}
}
});
</script>
</body>
这是我对于directive数据交互的粗浅理解。想要更详细了解,请参看官方文档:https://docs.angularjs.org/guide/directive
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# angularjs
# 数据交互
# directive
# AngularJS实现分页显示数据库信息
# Angular.JS内置服务$http对数据库的增删改使用教程
# 三种AngularJS中获取数据源的方式
# AngularJS实现数据列表的增加、删除和上移下移等功能实例
# 基于AngularJS实现页面滚动到底自动加载数据的功能
# Angularjs实现多个页面共享数据的方式
# Angular.js如何从PHP读取后台数据
# Angularjs 滚动加载更多数据
# 深入学习AngularJS中数据的双向绑定机制
# 在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
# Angular.JS读取数据库数据调用完整实例
# 如花
# 绑定
# 的是
# 很容易
# 变成了
# 几个
# 是有
# 多个
# 几天
# 我对
# 我这
# 也很
# 要注意
# 这是我
# 问题是
# 还未
# 可以实现
# 可以选择
# 不能用
# 这些都是
相关文章:
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
如何用腾讯建站主机快速创建免费网站?
已有域名如何免费搭建网站?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
如何通过老薛主机一键快速建站?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
内部网站制作流程,如何建立公司内部网站?
制作网站的模板软件,网站怎么建设?
如何通过云梦建站系统实现SEO快速优化?
如何在服务器上配置二级域名建站?
建站之星价格显示格式升级,你的预算足够吗?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
山东云建站价格为何差异显著?
北京专业网站制作设计师招聘,北京白云观官方网站?
如何在云指建站中生成FTP站点?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
香港服务器WordPress建站指南:SEO优化与高效部署策略
网站制作价目表怎么做,珍爱网婚介费用多少?
建站主机选购指南:核心配置优化与品牌推荐方案
建站主机如何安装配置?新手必看操作指南
全景视频制作网站有哪些,全景图怎么做成网页?
建站VPS配置与SEO优化指南:关键词排名提升策略
如何在VPS电脑上快速搭建网站?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
如何选择美橙互联多站合一建站方案?
如何在建站之星绑定自定义域名?
西安大型网站制作公司,西安招聘网站最好的是哪个?
宁波免费建站如何选择可靠模板与平台?
如何在Golang中指定模块版本_使用go.mod控制版本号
如何制作算命网站,怎么注册算命网站?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
如何在阿里云高效完成企业建站全流程?
如何通过NAT技术实现内网高效建站?
北京企业网站设计制作公司,北京铁路集团官方网站?
如何选择最佳自助建站系统?快速指南解析优劣
北京网站制作公司哪家好一点,北京租房网站有哪些?
官网网站制作腾讯审核要多久,联想路由器newifi官网
网站制作大概多少钱一个,做一个平台网站大概多少钱?
建站之星免费版是否永久可用?
如何用y主机助手快速搭建网站?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
如何快速生成ASP一键建站模板并优化安全性?
建站之星后台密码遗忘?如何快速找回?
*请认真填写需求信息,我们会在24小时内与您取得联系。