Javascript, angularjs,可以动态插入ng-mouseover
Javascript, angularjs, can a ng-mouseover be inserted dynamically?
这段代码显然不起作用:
var run_div = document.createElement('div');
run_div.className = 'whatever';
run_div.textContent = 'whatever';
run_div.setAttribute('ng-mouseover', 'console.log(''ei'')');
document.getElementById('main_div').appendChild(run_div);
我猜这是因为ng-mouseover
必须从一开始就存在,以便AngularJS知道(?)。是这样吗?有什么办法可以做到吗?
(下面:UPDATE 1, UPDATE 2, UPDATE 3)
UPDATE 1:
这段代码在工厂中工作,我从控制器调用工厂方法发送$scope
:
angular.module('whatever').controller('mycontroller',
['$scope', '$q', '$window', '$timeout',
function ($scope, $q, $window, $timeout) {
$scope.myfunction= function() {
myfactory.mymethod($scope);
};
工厂在其定义中调用$compile
:
angular.module('whatever').factory('myfactory',
['$window', '$q', '$compile',
function($window, $q, $compile) {
…
mymethod = function($scope) {
var run_div = document.createElement('div');
run_div.className = 'whatever';
run_div.textContent = 'whatever';
run_div.setAttribute('ng-mouseover', 'console.log(''ei'')');
document.getElementById('main_div').appendChild(run_div);
}
不起作用,然后抛出一个错误:
document.getElementById('main_div').appendChild($compile(run_div)($scope));
document.getElementById('main_div').appendChild($compile(run_div)($scope.new()));
甚至:
var run_div = angular.element(document.createElement('div'));
run_div.addClass('whatever');
run_div.attr('ng-mouseenter', 'console.log(''ei''');
document.getElementById('main_div').appendChild($compile(run_div)($scope));
,它抱怨当追加时,参数不是一个节点。
Uncaught (in promise) TypeError: Failed to execute 'appendChild' on 'Node':参数1不是'Node'类型。(…)
更新2:
下面的代码显示(我认为),当编译和从工厂追加它不工作,但当做它从控制器,它的工作(见答案2):
http://jsfiddle.net/xsaudasp/1/更新3 我可以看到这必须工作,如下所示: http://jsfiddle.net/2uk2qe92/4/
首先,你需要为你的指令创建一个新的$scope实例,然后使用$compile服务来编译给定的div范围:
var directiveScope = $scope.$new();
var compiledDirective = $compile(run_div)(directiveScope);
然后你可以把它附加到DOM:
angular.element('#my_dir').append(compiledDriective);
你必须确保jQuery在angular之前被加载,这样jQuery选择器才可用。如果你不想使用jQuery,你可以使用jqLite选择器:
angular.element(document.querySelector('#my_dir')).append(compiledDirective)
这里是您需要的工作jsfiddle: jsfiddle
您需要在将run_div插入DOM之前编译它:
只需这样使用$compile服务:
document.getElementById('main_div').appendChild($compile(run_div)($scope));
你应该考虑使用指令,但在你的控制器中操纵DOM是不建议的。
编辑1:
创建一个指令:
.directive('myShinyElement', function() {
return {
restrict: 'E',
scope: {
text: '='
},
template '<div class="whatever" ng-mouseover="mouseOver()">{{text}}</div>',
link: function(scope, element, attrs, tabsCtrl) {
scope.mouseOver = function(){
console.log('mouseover');
}
}
};
});
并在你的html中使用:
<my-shiny-element text="Dataset.analysis[$index].dataset.name"> </my-shiny-element>
相关文章:
- Angular,表达式{{}}的结果没有插入到ng-click中
- 如何在手动插入一些文本后更新文本区域的ng模型
- AngularJS:如何将ng-click绑定到使用嵌入或对象元素插入的SVG图像
- 安装 ng-mouseover 和 ng-mouseout 会导致效率极低的 AngularJS 代码
- 在模板中以字符串形式动态插入ng控制器
- 在 ng-repeat in angular-js 中插入竖条
- ng-click似乎不适用于以编程方式插入的列表(li)元素
- ng包括未插入正确获取的 DOM
- 在指令'内的ng重复中编译有条件插入的html;s模板
- 指令中ng重复的插入输出
- 在平板电脑上使用ng mouseenter或ng mouseover时,ng点击未触发
- 在AngularJS中激活mouseover上的.gif,并使用ng repeat
- 如何制作一个ng重复过滤器,为每个对象插入相应的html和{{expression}}
- 使用ng指令将HTML插入视图::AngularJS+JavaScript+Ionic
- Ng-if with animated class不能和ng-mouseover一起工作
- Javascript, angularjs,可以动态插入ng-mouseover
- Ng-mouseover和ng-show不工作
- 将ng开关插入ng repeat内部时的角度误差
- 如何读取插入 ng 模型中的数据
- Ng-mouseover和leave在angularjs中使用鼠标切换项