先回顾一下我们遇到的问题:

通过一个dialogService创建对话框,并将该service的参数数据通过resolve的方式传递给对话框的controller。

controller解析数据后放置在$scope上,供内部的directive使用。

现在希望在dialog打开后,如果对话框页面内的部分再次调用到这个service时,可以复用原来的对话框,仅仅将数据更新。controller内部的directive已经可以通过$digest自动更新view,只需要让dialogService把新的数据传递给controller。

先想到一个简单的方案:

既然service要区分第一次打开和复用的情况,就让service暴露一个接口,controller把自己注册进去,随后service就可以通过controller上提供的方法去更新数据。

然而,这种方法对于单例的service而言,保存一个controller的实例存在内存泄露的风险。而且service的职责不清晰,来回调用传递数据也过于复杂。

于是我们换了一个思路:

1. 对于dialogService本身建模,令用户代码持有service实例对象,每次打开新对话框时创建一个新的service实例。service实例与对话框相对应。

2. 既然要求一次打开dialog后可以复用,就意味着dialog是一个单例,可以采用单例模式。用户代码访问service的工厂获取service创建或者获取service实体。

3. 进一步的,将数据的holder放置在service定义的部分,service可以通过闭包来更新数据,service再将数据的应用resolve给controller,controller就可以直接看到更新过的数据,而不需要来回赋值。

下面给出一个大致的实现

module.factory('dialogService', function(){
function DialogService(){
this.dialogParam = {};
} DialogService.prototype.createDialog = function(data){
this.dialogParam.data = data;
// call functions to open the dialog
// resolve the this.dialogParam to the controller
}; DialogService.prototype.onDialogClose = function(){
// 清除工作,需要将serviceInstance和dialogParam清空。
}; var serviceInstance;
return {
getService: function(){
if (!serviceInstance){
serviceInstance = new DialogService();
}
return serviceInstance;
}
};
});

可以看到在以上代码中,基本只是一个单例模式的实现。这个和在java里面差不多,而且还要简单,因为javascript没有多线程的问题。

调用关系和职责划分也更清晰。

给angularJs的service建模的更多相关文章

  1. AngularJS:Service

    ylbtech-AngularJS:Service 1.返回顶部 1. AngularJS 服务(Service) AngularJS 中你可以创建自己的服务,或使用内建服务. 什么是服务? 在 An ...

  2. AngularJS 1.x系列:AngularJS服务-Service

    1. AngularJS服务 AngularJS可注入类型包括:Service.Factory.Provider.Value及Constant. 2. Service AngularJS Servic ...

  3. AngularJS之Service(四)

    前言 前面我们讲了控制器.过滤器以及指令,这一节我们来讲讲重大内容之一服务和其中涉及到的工厂. 话题 AngularJS中服务可以说是和DI紧密联系在一起,在应用程序中我们可以通过使用服务来共享代码, ...

  4. AngularJS 服务(Service)

    AngularJS 中你可以创建自己的服务,或使用内建服务. 什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. AngularJS 内建了30 ...

  5. Make AngularJS $http service behave like jQuery.ajax()(转)

    There is much confusion among newcomers to AngularJS as to why the $http service shorthand functions ...

  6. angularjs factory,service,provider 自定义服务的不同

    angularjs框架学了有一段时间了,感觉很好用.可以把angularjs的app理解成php的class,controller是控制器,而内置服务和自定义服务就可以理解成models了.angul ...

  7. AngularJS 1.x系列:AngularJS服务-Service、Factory、Provider、Value及Constant(5)

    1. AngularJS服务 AngularJS可注入类型包括:Service.Factory.Provider.Value及Constant. 2. Service AngularJS Servic ...

  8. Angularjs演示Service功能

    在angularjs中,我们可以自定义自己的service.可以说得是自定义的方法,函数. 下面我们一步一步来演示吧:首先为angularjs定义一个app: var demoApp = angula ...

  9. 【angularJS】Service服务

    AngularJS 中的服务是一个函数或对象.可以创建自己的服务,或使用内建服务. 内置服务 AngularJS 内建了30 多个服务. 1.  $location 服务,它可以返回当前页面的 URL ...

随机推荐

  1. Tomcat 实现双向SSL认证

    大概思路: 使用openssl生产CA证书,使用keytool生产密钥库 实验环境:RHEL6.4+Tomcat8 一.生成CA根证书,并自签名 1.生成CA密钥 # genrsa [产生密钥命令] ...

  2. 转: python如何安装pip和easy_installer工具

    原文地址: http://blog.chinaunix.net/uid-12014716-id-3859827.html 1.在以下地址下载最新的PIP安装文件:http://pypi.python. ...

  3. php sleep()的实时输出打印,清除ob缓冲区

    @ini_set('implicit_flush',1);ob_implicit_flush(1);@ob_end_clean(); echo 1;//echo str_repeat('', 1024 ...

  4. PHP中使用cURL实现Get和Post请求的方法

    1.cURL介绍  cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 cURL 库.本文将介绍 cURL 的一些高级特 ...

  5. sql 2012日志文件频繁出现:svchost (4892) 数据库引擎已分离数据库(1、C:\Windows\system32\LogFiles\Sum\Current.mdb)

    svchost (4892) 数据库引擎已分离数据库(1.C:\Windows\system32\LogFiles\Sum\Current.mdb).(时间=0 秒) 内部计时序列: [1] 0.00 ...

  6. Runtime初学习

    什么是runtime? runtime是一套纯c的API.平时用oc写的代码在运行时都会先转成runtime代码,然后在执行. runtime可以干什么? 1.交换方法.(method_exchang ...

  7. chapter1 渗透测试与metasploit

    网络对抗技术课程学习 chapter1 渗透测试与metasploit 一.读书笔记 二.渗透测试 通过模拟恶意攻击者的技术与方法进行攻击,挫败目标系统安全控制措施,取得访问控制权,并发现具备业务影响 ...

  8. CentOS 安装rz和sz命令

    虚机装了CentOS7.2最小版本, 结果上去后发现rz命令不能用 yum install lrzsz  安装完成:

  9. Qt之QMutex

    概述 QMutex 类使得线程之间可序列化,文档中的描述为provides access serialization between threads 它被设计的初衷是用来保护一个对象.数据结构.代码段 ...

  10. db2 常用命令

    db2osconf 检查系统内核参数 db2pd 监控检查数据库工具,可以检查数据库的许多信息(锁.交易.表空间. SQL等) db2expln 查看程序包的执行计划 db2exfmt 格式化expl ...