首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果元素是由指令生成的,则ng-click不起作用。

如果元素是由指令生成的,则ng-click不起作用。
EN

Stack Overflow用户
提问于 2015-09-10 06:11:29
回答 3查看 410关注 0票数 1

我正在angularJS中创建一个angularJS,它将用一些元素(分页)替换我的自定义元素,由directive生成的元素有ng-click属性,ng-click属性值是控制器的函数,但ng-click不能工作。

元素是

代码语言:javascript
复制
<my-element totalCount="5"></my-element>

控制器是

代码语言:javascript
复制
.controller('AppControler',['$scope'],function($scope){
    $scope.function1 = function(value){
        console.log('in function1 value = '+value);
    }
});

指令是

代码语言:javascript
复制
.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

实际上,我的directiveisolate-scope,如果我用$($element).append($compile(link)($scope));编译元素,那么这个元素就链接到指令的作用域,但是我想编译带有父作用域的元素

UPDATE2

我对我的元素做了一些修改,比如

代码语言:javascript
复制
<my-element totalCount="5" func-to-call="function1()"></my-element>

在指令中

代码语言:javascript
复制
.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(值)给出的错误为

代码语言:javascript
复制
TypeError: Cannot use 'in' operator to search for 'function1' in <3>

UPDATE3

创建柱塞

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-10 09:23:10

要从指令中调用外部函数(控制器函数),当指令具有isolated scope集时,需要将控制器函数传递给指令,如下所示。

<my-element func-to-call="function1" total-count="5"></my-element>

然后,此函数将作为本地隔离作用域作为指令可用,如

scope: { totalCount: '@', funcToCall: '&' },

此外,我们可以在指令控制器中使用函数来调用这个外部函数(当然还有其他方法),例如

代码语言:javascript
复制
$scope.function2 = function(value){       
      $scope.funcToCall()(value);
    }

最后,我们可以在指令元素(如$scope.function2 )中调用var link = $('<li><a ng-click="function2('+i+');">'+i+'</a></li>');

下面是完整的指令代码。

代码语言:javascript
复制
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();
  }
};
});
票数 0
EN

Stack Overflow用户

发布于 2015-09-10 07:16:40

在指令中有一个独立的作用域,要访问父函数,需要传递该函数,并且可以在指令中使用"&“。

代码语言:javascript
复制
scope:{
    totalCount: '@',
    fnt : '&'
 }

将其绑定到ng-单击ng-click="fnt()"

要从父元素传递它,元素将如下所示:

代码语言:javascript
复制
<my-element totalCount="5" fnt="parentFunction"></my-element>
票数 1
EN

Stack Overflow用户

发布于 2015-09-10 06:15:52

在将$compile添加到DOM类之前,您需要使用它,

代码语言:javascript
复制
var link = '<li><a href="javascript:;" ng-click="function1('+i+');">'+i+'</a></li>';
$($element).append($compile(link)($scope));

这个问题类似于使用AngularJS单击事件添加的动态内容无法处理添加的内容

更新:您可以通过=控件进行双向绑定,例如,

代码语言:javascript
复制
scope: {
  control: '='
},

最后更新不需要在您的$scope.$parent.function1(value);中添加另一个调用function2 call

代码语言:javascript
复制
$scope.function2 = function(value){
    console.log('function2 value = '+value);
    $scope.$parent.function1(value);
}

演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32494397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档