自定义Directive使用ngModel
我们知道ngModel是AngularJS中默认的一个Directive,用于数据的双向绑定。通常是这样使用的:
<input type="text" ng-model="customer.name" />
在控制器中大致这样:
$scope.customer ={
name: ''
}
在上一篇中,有关表格的Directive是这样使用的:
<table-helper datasource="customers" clumnmap="[{name: 'Name'}, {street: 'Street'}, {age: 'Age'}, {url: 'URL', hidden: true}]"></table-helper>
以上,datasource代表数据源,是否可以用ng-model替代呢?
比如写成这样:
<table-helper-with-ng-model ng-model="customers" columnmap="[{name:'Name'}...]">
</table-helper-with-ng-model>
可是,自定义的tableHelper这个Direcitve如何获取到ngModel中的值呢?
这就涉及到Direcitve之间的通讯了,就像在"AngularJS中Directive间交互实现合成"说的。
要解决的第一个问题是:如何拿到ngModel?
--使用require字段
return {
restrict: 'E',
required: '?ngModel', //^ngModel本级或父级, ^^ngModel父级
scope: {
columnmap: '='
},
link: link,
template: template
}
要解决的第二个问题是:如何从ngModel这个Direcitve拿数据?
--使用ngModel.$modelValue
要解决的的第三个问题是:当ngModel值变化,如何告之外界并重新加载表格?
--大致有4种方法
//1 观察某个属性的值
attrs.$observe('ngModel', function(value){
//监视变量的值
scope.$watch(value, function(newValue){
render();
});
}); //2 或者
scope.$watch(attrs.ngModel, render); //3 或者
scope.$watch(function(){
return ngModel.$modelValue;
}, function(newValue){
render();
}) //4 或者
ngModel.$render = function(){
render();
}
相对完整的代码如下:
var tableHelperWithNgModel = function(){
var dataSource;
var template = '<div class="tableHelper"></div>';
var link = function(scope, element, attrs, ngModel){
...
function render(){
if(ngModel && ngModel.$modelValue.length){
datasource = ngModel.$modelValue;
table += tableStart;
table += renderHeader();
table += renderRows() + tableEnd;
renderTable();
}
}
};
return {
restrict: 'E',
required: '?ngModel', //^ngModel本级或父级, ^^ngModel父级
scope: {
columnmap: '='
},
link: link,
template: template
}
}
angular.module('direcitveModule')
.directive('tableHelperWithNgModel', tableHelperWithNgModel)
var tableHelperWithNgModel = function(){
var dataSource;
var template = '<div class="tableHelper"></div>';
var link = function(scope, element, attrs, ngModel){
//观察某个属性的值
attrs.$observe('ngModel', function(value){
//监视变量的值
scope.$watch(value, function(newValue){
render();
});
});
//或者
scope.$watch(attrs.ngModel, render);
//或者
scope.$watch(function(){
return ngModel.$modelValue;
}, function(newValue){
render();
})
//或者
ngModel.$render = function(){
render();
}
function render(){
if(ngModel && ngModel.$modelValue.length){
datasource = ngModel.$modelValue;
table += tableStart;
table += renderHeader();
table += renderRows() + tableEnd;
renderTable();
}
}
};
return {
restrict: 'E',
required: '?ngModel', //^ngModel本级或父级, ^^ngModel父级
scope: {
columnmap: '='
},
link: link,
template: template
}
}
angular.module('direcitveModule')
.directive('tableHelperWithNgModel', tableHelperWithNgModel)
自定义Directive使用ngModel的更多相关文章
- 理解AngularJS生命周期:利用ng-repeat动态解析自定义directive
ng-repeat是AngularJS中一个非常重要和有意思的directive,常见的用法之一是将某种自定义directive和ng-repeat一起使用,循环地来渲染开发者所需要的组件.比如现在有 ...
- AngularJS自定义Directive
(编辑完这篇之后,发现本篇内容应该属于AngularJS的进阶,内容有点多,有几个例子偷懒直接用了官方的Demo稍加了一些注释,敬请见谅). 前面一篇介绍了各种常用的AngularJS内建的Direc ...
- 关于angular 自定义directive
关于angular 自定义directive的小结 首先我们创建一个名为"expander"的自定义directive指令: angular.module("myApp& ...
- AngularJs中,如何在父元素中调用子元素为自定义Directive中定义的函数?
最近一段时间准备使用AngularJs中的自定义Directive重构一下代码. 在这里说明一下,把自定义控件封装成Directive并不一定是要复用,而是要让代码结构更加清晰.就好像你将一个长方法拆 ...
- AngularJS自定义Directive中link和controller的区别
在AngularJS中,自定义Directive过程中,有时用link和controller都能实现相同的功能.那么,两者有什么区别呢? 使用link函数的Directive 页面大致是: <b ...
- AngularJS自定义Directive不一定返回对象
AngularJS中,当需要自定义Directive时,通常返回一个对象,就像如下的写法: angular.module('modulename') .directive('myDirective', ...
- AngularJS自定义Directive初体验
通常我们这样定义个module并随之定义一个controller. var app = angular.module('myApp', []); app.controller('CustomersCo ...
- AngularJs(Part 11)--自定义Directive
先对自定义Directive有一个大体的映像 myModule.directive('myDirective',function(injectables){ var directiveDefiniti ...
- angularJs中自定义directive的数据交互
首先放官方文档地址:https://docs.angularjs.org/guide/directive 就我对directive的粗浅理解,它一般用于独立Dom元素的封装,应用场合为控件重用和逻辑模 ...
随机推荐
- centos7 部署 docker compose
=============================================== 2019/4/10_第1次修改 ccb_warlock == ...
- TCP 远程执行CMD (解决粘包问题) 代码
服务端 from socket import * import subprocess,json,struct server= socket(AF_INET,SOCK_STREAM) server.bi ...
- Android学习笔记————利用JDBC连接服务器数据库
/******************************************************************************************** * auth ...
- poj2739 poj2100 尺取法基础(二)
都是很简单的题目 poj2739素数打表+单点推移 #include<iostream> #include<cstring> #include<cstdio> us ...
- DDD领域模型系统的工作流(十四)
在自定义的Windows窗体中运行工作流:(把工作流的代码放入到文本框中) public partial class Form1 : Form { public Form1() { Initializ ...
- DDD领域模型数据访问权限之用户权限(十)
BAS_PRService岗位和角色服务: public class BAS_PRService { //岗位 private IRepository<BAS_Post> ireposit ...
- Ext.js项目(一)
这个项目整体采用代码生成器生成,具体看下图:
- springbank 开发日志 阅读spring mvc的源代码真是受益良多
决定模仿spring mvc的dispatcher->handlerMapping(return executorChain)->handler.execute 这样的流程之后,就开始看s ...
- 【Java】 剑指offer(53-1) 数字在排序数组中出现的次数
正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 统计一个数字在排序数组中出现的次数.例如输入排序数组{1, ...
- 006 Spark中的wordcount以及TopK的程序编写
1.启动 启动HDFS 启动spark的local模式./spark-shell 2.知识点 textFile: def textFile( path: String, minPartitions: ...