我正在angularJS中创建一个angularJS,它将用一些元素(分页)替换我的自定义元素,由directive生成的元素有ng-click属性,ng-click属性值是控制器的函数,但ng-click不能工作。
元素是
<my-element totalCount="5"></my-element>控制器是
.controller('AppControler',['$scope'],function($scope){
$scope.function1 = function(value){
console.log('in function1 value = '+value);
}
});指令是
.directive('myElement',function(){
return{
restrict: 'E',
replace: true,
scope:{
totalCount: '@'
},
template: '<ul class="pagination"></ul>`,
controller: function($scope, $element, $attrs){
$scope.draw = function(){
$($element).empty();
for (var i=1; i<=$scope.totalCount; i++){
var link = $('<li><a href="javascript:;" ng-click="function1('+i+');">'+i+'</a></li>');
$($element).append(link);
}
}
},
link: function(scope, element, attr, controller){
attr.$observe('totalCount', function(){
scope.draw();
});
}
};
});但是,当我单击<li>元素时,不会调用function1 of AppController。
UPDATE1
实际上,我的directive有isolate-scope,如果我用$($element).append($compile(link)($scope));编译元素,那么这个元素就链接到指令的作用域,但是我想编译带有父作用域的元素
UPDATE2
我对我的元素做了一些修改,比如
<my-element totalCount="5" func-to-call="function1()"></my-element>在指令中
.directive('myElement',function($compile){
return{
...
...
scope:{
totalCount: '@',
funcToCall: '&'
},
...
controller: function($scope, $element, $attrs){
$scope.draw = function(){
....
....
var link = $('<li><a href="javascript:;" ng-click="function2('+i+');">'+i+'</a></li>');
$($element).append($compile(link)($scope));
....
....
}
$scope.function2 = function(value){
console.log('function2 value = '+value);
$scope.funcToCall(value);
}
}
....
....
};
});在这种情况下,指令作用域的function2是在控制台中调用和打印值,但是$scope.funcToCall(值)给出的错误为
TypeError: Cannot use 'in' operator to search for 'function1' in <3>UPDATE3
创建柱塞
发布于 2015-09-10 09:23:10
要从指令中调用外部函数(控制器函数),当指令具有isolated scope集时,需要将控制器函数传递给指令,如下所示。
<my-element func-to-call="function1" total-count="5"></my-element>
然后,此函数将作为本地隔离作用域作为指令可用,如
scope: { totalCount: '@', funcToCall: '&' },
此外,我们可以在指令控制器中使用函数来调用这个外部函数(当然还有其他方法),例如
$scope.function2 = function(value){
$scope.funcToCall()(value);
}最后,我们可以在指令元素(如$scope.function2 )中调用var link = $('<li><a ng-click="function2('+i+');">'+i+'</a></li>');
下面是完整的指令代码。
app.directive('myElement', function($compile){
return{
restrict: 'E',
replace: true,
scope: {
totalCount: '@',
funcToCall: '&'
},
template: '<ul class="pagination"></ul>',
controller: function($scope, $element, $attrs){
$scope.draw = function(){
$($element).empty();
for (var i=1; i<$scope.totalCount; i++){
var link = $('<li><a ng-click="function2('+i+');">'+i+'</a></li>');
$($element).append($compile(link)($scope));
}
}
$scope.function2 = function(value){
//console.log('function2 value = '+value);
$scope.funcToCall()(value);
}
},
link: function(scope, element, attr, controller){
scope.draw();
}
};
});发布于 2015-09-10 07:16:40
在指令中有一个独立的作用域,要访问父函数,需要传递该函数,并且可以在指令中使用"&“。
scope:{
totalCount: '@',
fnt : '&'
}将其绑定到ng-单击ng-click="fnt()"
要从父元素传递它,元素将如下所示:
<my-element totalCount="5" fnt="parentFunction"></my-element>发布于 2015-09-10 06:15:52
在将$compile添加到DOM类之前,您需要使用它,
var link = '<li><a href="javascript:;" ng-click="function1('+i+');">'+i+'</a></li>';
$($element).append($compile(link)($scope));这个问题类似于使用AngularJS单击事件添加的动态内容无法处理添加的内容
更新:您可以通过=控件进行双向绑定,例如,
scope: {
control: '='
},最后更新不需要在您的$scope.$parent.function1(value);中添加另一个调用function2 call,
$scope.function2 = function(value){
console.log('function2 value = '+value);
$scope.$parent.function1(value);
}演示
https://stackoverflow.com/questions/32494397
复制相似问题