AngularJS - 动态 DOM 操作,无需在控制器中硬编码 dom id
AngularJS - Dynamic DOM manipulation without hardcoding dom id's in the controller
我仍然开始使用 angular,似乎"Angular 方式"是将视图与控制器分开,因此,到目前为止,我在 angular 中的 DOM 操作似乎非常笨拙,因为我必须做很多手动 dom 元素选择。我的应用程序目前看起来像这样;
.HTML:
<div ng-controller="appController as appCtrl">
<div>
<div id="element1"></div>
<div id="element2"></div>
<div id="element3"></div>
<button ng-click="appCtrl.animateStuff()"></button>
</div>
</div>
控制器:
app.controller('appController', ['animationFactory', 'domFactory', appControllerFunc]);
function appControllerFunc(animationFactory, domFactory) {
This = this;
This.animateStuff = function() {
animationFactory.animate(domFactory.getNgElementById('element1'));
animationFactory.animate(domFactory.getNgElementById('element2'));
animationFactory.animate(domFactory.getNgElementById('element3'));
}
}
工厂:
app.factory('domFactory', [domFactoryFunc]);
function domFactoryFunc() {
var domFactoryContainer = {
getNgElementById: function(id) {
return angular.element(document.getELementById(id));
}
}
return domFactoryContainer;
}
app.factory('animationFactory');
function animationFactoryFunc() {
var animationFactoryContainer = {
animate: function(ngelement) {
// animates ngelement
}
}
return animationFactoryContainer;
}
有没有办法以某种方式从视图的 ng 单击将 DOM 元素发送到控制器?像ngclick="ctrl.animateStuff([#element1],[#element2],[#element3]("这样的东西,所以我的控制器只需要获取参数并操作它们,甚至对DOM一无所知?或者指令可以用于此吗?如果是这样,如何?
如果你不能使用 Angular 的 ngAminate(它不需要 DOM 操作,因为它使用 css(,你可以构建一个自定义指令。指令是允许 DOM 操作的地方,你会将实际元素传递到指令中,所以不需要硬编码的 id。
但我建议遵循@NewDev的建议。
这将是指令的可能存根:
module.directive('myAnimation', function() {
return {
restrict: 'A',
scope: {
enabled: '='
},
link: function(scope, element) {
// watch on enabled and start animation when set to true
}
}
});
和你的标记:
<div my-animation enabled='enabled'></div>
<div my-animation enabled='enabled'></div>
<div my-animation enabled='enabled'></div>
<button ng-click="enabled=true"></button>
要立即解锁您,您可以这样做
<div id="element1" ng-click="ctrl.animateStuff($event)"></div>
这会将事件传递给您的函数,您可以从中提取 DOM 元素。
我不熟悉GSAP,但你应该能够将它与ngAnimate的做事方式联系起来。
而且,我会重复一遍 - 不要访问或对控制器中的 DOM 做出任何假设 - 您正在破坏 Angular 的最佳实践,并且经常会发现自己遇到问题和头痛。
相关文章:
- 在指令控制器中使用$attrs时出现问题
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 从控制器返回后Ajax启动事件激发
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- 如何在单击复选框后调用控制器方法
- 如何编码/解码这个专有校验和(Athena 16C PID控制器)
- 尝试通过 Angular 控制器使用 Google Geocode API 进行地理编码,值未定义
- 如何使用json对发送到MVC控制器的数据进行编码
- 从函数调用控制器并向其传递 URL 编码参数
- AngularJS - 动态 DOM 操作,无需在控制器中硬编码 dom id
- 如何在AngularJS控制器中编码一个URL
- 编码器将一个变量从ajax发送到控制器
- 如何在编码器中传递ajax变量值给控制器
- 编码器中的自动刷新控制器功能
- javascript文件中的编码器(控制器)文件路径
- 如何通过ajax传递隐藏字段值到编码器控制器
- 将文本区数据从视图传递到控制器编码器
- 在asp.net mvc中使用地理编码,并希望将纬度和经度从JS传递到控制器中的某个函数
- 避免硬编码控制器名称Angularjs
- 从控制器编码器调用javascript函数