AngularJS项目开发技巧之获取模态对话框中的组件ID

需求

出于项目开发需求,需要实现的业务逻辑是:药店端点击查看“已发货”“已收货”订单详情时,模块弹出框中只应出现“取消”按钮。但现实的情况如下图所示。

模态框核心代码如下:

<script type="text/ng-template" id="billDtlContent.html">

<div class="modal-header">

<h3 class="modal-title">立马送药订单</h3>

</div>

<div class="modal-body" id="modal-body" >

<table border="1" class="table table-bordered" >

<tr>

<td>

<div>

<label for="billid">订单编号:</label>

<input ng-model="billid" id="billid" type="text" disabled/>

</div>

</td>

</tr>

...................................................

...................................................

<td>

<div>

<label for="merch_name">配送药店:</label>

<input ng-model="merch_name" id="merch_name" type="text" disabled/>

</div>

</td>

</tr>

</table>

</div>

<div class="modal-footer" id="modal-footer" >

<button id="ok" class="btn btn-primary btn-lg" type="button" ng-click="ok()">确认配送</button>

<button id="reject" class="btn btn-danger btn-lg" type="button" ng-click="reject()">残忍拒绝</button>

<button id="cancel" class="btn btn-warning btn-lg" type="button" ng-click="cancel()">取消</button>

</div>

</script>

由于模态框的实现代码位于JS脚本中。则考虑使用获取组件ID的方式获取相应组件“确认配送”“残忍拒绝”的ID,经过在其控制器中获取测试,总是显示其值为null。获取语句如下:

console.log("LTT_Sunny:");
console.log(instance.bill_status_code);
if(instance.bill_status_code === '1' || instance.bill_status_code == '2'){
alert("SHQ:" + document.getElementById("reject"));
}

经过进一步的阅读代码,发现可以先获取模态框组件的ID,即如下语句实现:

 document.getElementById("billDtlContent.html").innerHTML;

执行后的结果如下图所示:

那么是不是可以进一步获取其内部组件的ID呢?继续尝试如下:

document.getElementById("billDtlContent.html").innerHTML.getElementById("reject"));

结果出现了错误,如下所示:

吸取前面做二维码时的教训,在其相应html页面中添加如下语句:

<i id="sunny" hidden="hidden"></i>

      控制器中的语句如下:

document.getElementById("sunny").innerHTML = htmlContent;
alert("SHQ:" + document.getElementById("sunny").innerHTML);
alert("SHQ:" + document.getElementById("reject"));

结果获取到了相应组件的ID。

总结

有时一个问题解决不了,就应该尝试着通过其它途径进行解决。就像在本文中,既然直接获取无法获取到JS脚本中组件的ID,自己就尝试着将获取到的页面内容再次放到原页面内,然后通过DOM操作再次获取。

后续工作

获取到模态框组件ID之后,就需要实现需求了。有关组件的隐藏方法自己已经完成。如下所示:

//控件隐藏控制函数
function displayHideUI(object)
{
var ui = object;

ui.style.display = "none";
}

// 控件显示控制函数
function displayUI(object)
{
var ui = object;

ui.style.display = "inline-block";
}

在控制器中调用控件设置方法没有看到效果。

displayHideUI(document.getElementById("reject"));

通过DOM操作可获取到其中的ID名称等等。如下所示:

alert("SHQ:" + document.getElementById("reject").attributes[0].value);

在view中做文章是不可能的了,还是需要改变一下思路。有时灵感就是来的这么突然,就像幸福一样。考虑在控制器中下手,还是阅读代码,思考是否可以通过if_else的形式实现上述效果。ng-if就暂不考虑了,因为一般的if语句就足以解决问题。既然模态框是根据其ID值加载的,那么自己就可以在控制器中通过if语句控制加载不同的模态框。那么自己就需要在模态框中添加新的模态框内容了。添加的模态框内容如下:

<script type="text/ng-template" id="billDtlContent1.html">

<div class="modal-header">

<h3 class="modal-title">立马送药订单</h3>

</div>

<div class="modal-body" id="modal-body" >

<table border="1" class="table table-bordered" >

<tr>

<td>

<div>

<label for="billid">订单编号:</label>

<input ng-model="billid" id="billid" type="text" disabled/>

</div>

</td>

</tr>

............................

...................................

<tr>

<td>

<div>

<label for="merch_name">配送药店:</label>

<input ng-model="merch_name" id="merch_name" type="text" disabled/>

</div>

</td>

</tr>

</table>

</div>

<div class="modal-footer" id="modal-footer" >

<button id="cancel_Sunny" class="btn btn-warning btn-lg" type="button" ng-click="cancel()">取消</button>

</div>

</script>

请注意以上两个模态框是不同的,主要不同点为:模态框的ID、控制按钮。在控制器中,其if控制语句如下:

console.log("LTT_Sunny:");
console.log(instance.bill_status_code);
if(instance.bill_status_code === '1' || instance.bill_status_code == '2'){
// 在药店订单查询成功后,回调执行模态框弹出
modalInstance = $modal.open({	// 开始执行控制器BillDtlPopCtrl
templateUrl: 'billDtlContent1.html',	// 模态窗口的地址,指向创建的视图
controller: 'BillDtlPopCtrl',	// 初始化模态范围,为$modal指定的控制器,初始化$scope,该控制器可用$modalInstance注入
resolve: {	// 定义一个成员并将他传递给$modal指定的控制器,相当于routes的一个reslove属性,如果需要传递一个objec对象,需要使用angular.copy()
items: function () {
return $scope.items;
}
}
);
}else{
// 在药店订单查询成功后,回调执行模态框弹出
modalInstance = $modal.open({// 开始执行控制器BillDtlPopCtrl
templateUrl: 'billDtlContent.html',	// 模态窗口的地址,指向创建的视图
controller: 'BillDtlPopCtrl',	// 初始化模态范围,为$modal指定的控制器,初始化$scope,该控制器可用$modalInstance注入
resolve: {	// 定义一个成员并将他传递给$modal指定的控制器,相当于routes的一个reslove属性,如果需要传递一个objec对象,需要使用angular.copy()
items: function () {
return $scope.items;
}
}
});
}

效果图

参考文献

http://www.w3school.com.cn/jsref/dom_obj_attributes.asp

美文美图

AngularJS进阶(三十一)AngularJS项目开发技巧之获取模态对话框中的组件ID的更多相关文章

  1. AngularJS进阶(三十)AngularJS项目开发技巧之图片预加载

    AngularJS项目开发技巧之图片预加载 绪 项目(移动端采用Ionic 框架)开发完毕,测试阶段发现移动APP首页的广告图片(图片由服务器端返回相应url地址)很难加载,主要原因还是网速.如下图左 ...

  2. AngularJS进阶(二十一)Angularjs中scope与rootscope区别及联系

    Angularjs中scope与rootscope区别及联系 scope是html和单个controller之间的桥梁,数据绑定就靠他了.rootscope是各个controller中scope的桥梁 ...

  3. AngularJS进阶(三十六)AngularJS项目开发技巧之利用Service&Promise&Resolve解决图片预加载问题(后记)

    AngularJS项目开发技巧之利用Service&Promise&Resolve解决图片预加载问题(后记) 前言 在"AngularJS项目开发技巧之图片预加载" ...

  4. AngularJS进阶(二十九)AngularJS项目开发技巧之localStorage存储

    AngularJS项目开发技巧之localStorage存储       注: localStorage深度学习 绪 项目开发完毕,测试阶段发现后台管理端二维码生成有问题,问题在于localStora ...

  5. Java进阶(三十一) Web服务调用

    Java进阶(三十一) Web服务调用 前言 有朋友问了一个问题:如何调用已知的音乐服务接口,服务文档如下: https://www.evernote.com/shard/s744/sh/c37cd5 ...

  6. AngularJS进阶(三十九)基于项目实战解析ng启动加载过程

    基于项目实战解析ng启动加载过程 前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理.回过头来总结一下angular的启动过程. 下面以实际项目为例进行简要讲解. 1.载入ng库 2 ...

  7. 嵌入式C实战项目开发技巧:如果对一个有规律的数组表进行位移操作

    在嵌入式项目开发中,LED灯的操作是一定要会的,也是基础中的基础,比如用51单片机写个跑马灯,这不简单嘛,定义一个数组把那8个跑马灯存起来,然后搞个for循环不就可以了嘛,但是,实际工作开发中写一个跑 ...

  8. 获取class对象的三种方法以及通过Class对象获取某个类中变量,方法,访问成员

    public class ReflexAndClass { public static void main(String[] args) throws Exception { /** * 获取Clas ...

  9. AngularJS进阶(三十八)上拉加载问题解决方法

    AngularJS上拉加载问题解决方法 项目中始终存在一个问题:当在搜索栏输入关键词后(见图1),按照既定的业务逻辑应该是服务端接收到请求后,首先返回查询的前7条数据,待客户端出现上拉加载时,继续查找 ...

随机推荐

  1. PHP 5 Array 函数

    PHP Array 简介 PHP Array 函数允许您访问并操作数组. 支持简单的数组和多维数组. 安装 PHP Array 函数是 PHP 核心的组成部分.无需安装即可使用这些函数. PHP 5 ...

  2. Java第2次实验提纲(Java基本语法与类库)

    1. 使用Git克隆(clone)项目到你的Eclipse项目中 见以下参考资料中的3 从码云将项目clone到你的电脑 重要提示: 使用Git来管理你的代码以后,当你在本机Eclipse项目中开始编 ...

  3. MacOS下Rails+Nginx+SSL环境的搭建(中)

    三.配置Nginx 先是修改 hosts 文件,意思是创建一个本地域名以便我们访问,比如: $ sudo subl /etc/hosts 127.0.0.1 rails_project.local 但 ...

  4. Linux测量kernel子模块加载时间的方法

    1. 在文件kernel/init/main.c里面,在接口do_one_initcall( )中,将initcall_debug设置为true,然后编译boot.img 2. 使用adb shell ...

  5. 浅析深度学习mini_batch的BP反传算法

    在深度学习中,如果我们已经定义了网络,输入,以及输出,那么接下来就是损失函数,优化策略,以及一般由框架完成的BP反传.这篇博文我们主要探讨一下深度的BP反传算法(以梯度下降为例),尤其是mini_ba ...

  6. Ajax PHP JavaScript MySQL实现简易的无刷新在线聊天室

    思路 消息显示区 发消息 板块 消息显示 消息发送 优化 显示非重复性的数据 优化显示 加上滚动条 每次都显示最新消息 完整代码 前端代码 数据库表结构 服务器端代码 总结与展望 总结 展望 为更好的 ...

  7. 理解性能的奥秘——应用程序中慢,SSMS中快(1)——简介

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 在工作中发现有不少类似的现象,有幸看到国外大牛写的一篇文章,由于已经完善得不能再添油加醋,所以决定直接翻译,原文出处:http ...

  8. Dynamics CRM2016 Web API之通过实体的primary key查询记录(二)

    继续接上篇,还是通过primary key来查询数据,本篇介绍两个我个人比较喜欢的查询方式,一个是查询单个字段,一个是查询lookup关联实体中的属性字段. 先来看如何查询单个字段,只需要在url的最 ...

  9. 内存数据网格IMDG简介

    1 简介 将内存作为首要存储介质不是什么新鲜事儿,我们身边有很多主存数据库(IMDB或MMDB)的例子.在对主存的使用上,内存数据网格(In Memory Data Grid,IMDG)与IMDB类似 ...

  10. 在Linux环境下实现一个非常好的bash脚本框架

    为了方便我日常工作中的编译环境,免去我敲命令行所浪费的时间,我个人写了一个非常有用而又简单的脚本框架,该框架即可以完成的工程源码编译,也可以清除,拷贝等等操作,具体需要开发者自己来实现细节,我的框架思 ...