我需要建立一个对话框,以与任何项目的项目列表上使用。 对话几乎是一样的,不管项目除外,其显然取决于项目的字段的值。
该指令我建立是从文件中读取的模板,以$编译,然后结合(链接)它编译它的项目的范围。 结合的结果是DOM树。 为了使对话框中可见我需要这棵树添加一些元素在现有的DOM。 我对话的性质是这样的,它是有道理的,直接将其追加到body标签。 该对话框会多次使用结合列表上的不同项目
因此,这里是我的问题:如何这个过程的多(编译,绑定附加)可以提前做了什么? 我当然也可以运行编译一次。 我还可以在编译的结果绑定到$ rootscope和append(隐藏)它的body标签。 这样我可以在以后只要打开知名度,并显示该对话框。
但是,如果它已经绑定并连接到DOM,是犹太吧,如果是的话再结合一些其他的范围 - 什么是应该做的正确方法? 另一个问题是,它甚至值得吗? 可能只是每次需要的时候重新插入?
非常好的问题,我认为。 如果能“热插拔”的元素的范围,你想知道。 我不知道是否有一种方法可以做到这一点,或者即使有,如果是这样的角方式。 我想你看着怎么NG-视图的工作得到尽可能你已经得到?
我的建议是做$一次编译,保留的结果,这就是所谓的角说法链接或transclusion功能也好,周围的地方。 并调用它的对话框中每个需要的实例。
如果你只曾经打算以一次显示一个对话框这样的,你会经常使用它,你不必把它重新绑定到其它范围,只是改变示波器上的数据。 事情是这样的:
- 创建你的对话服务
- 创建指令和注入你的服务进去。 当结合功能执行,通过类似$ scope.dialogData的服务,使服务可以更新数据。
- 创建一个控制器,获得注入的服务。 通过该服务设置对话框中的数据,以显示该对话框。 既然你在控制器中修改数据是在指令范围,角通知是和更新您的对话框。
- 加入NG-显示在您的对话框的包装,使它很容易实现的open()/关闭()方法,你的服务。
现在你有可以从任何地方在你的系统中使用的对话框,然后你只是重复使用相同的指令,而无需惹DOM或汇编。
这确实是很好的问题,我很高兴地看到,越来越多的人开始接近对话框进行服务。
关于你提到的具体问题,下面是我的一些想法:
- 你可以在“缓存”链接功能(也就是-这是从返回的功能
$compile
调用)根据需要(在范围内的变量传递),然后调用这个函数。 - 而不是插入(隐藏)汇编的元素,你可以只重视其需求,当一个对话框被打开。 在此之上我将模态元素而连接到$ rootElement的 ,而不是
<body>
只是不要碰到上述其中的DOM元素ng-app
被定义。 只是不要触摸AngularJS没有控制DOM的部分。 - IMO对话是非常接近AngularJS路线(因为它们提供了不同的“意见”),因此这将是非常不错的解决承诺的能力模式显示(如路由)前。
事实上,有东西设计的好,一般的对话服务时要考虑的号码,我希望那些建议,一起与优异的输入他人提供的,将让你开始。 但是,这一切是有点理论上的,所以如果你正在寻找在这里讨论,你可以看看什么是执行此实现 。 (从$对话框服务http://angular-ui.github.com/bootstrap/ -它是完全可定制,从而可以用比引导的其他CSS使用文档。 这里 )。
它可以在行动中可以看出在这个普拉克: http://plnkr.co/edit/PG0iHG?p=preview