【问题标题】:angular directive to call scope method on click event角度指令在点击事件上调用范围方法
【发布时间】:2014-10-16 10:50:01
【问题描述】:

我有一个带有 k-grid-cancel-changes 类的按钮的网格。我想创建一个指令,将单击事件附加到该按钮并在页面范围内调用方法

    .directive('kGridCancelChanges', function () { 
               return {
                restrict: 'C',                
                scope: {
                    onCancelChanges: "&"
                },
                controller: function ($scope, $element, $attrs, $location) {
                    $element.click(function () {
                        $scope.onCancelChanges();
                    });
                }

            }
});

当我按下按钮时,我可以看到 $scope.onCancelChanges() 从我的指令中触发,但它从未达到页面范围内的功能。

 $scope.onCancelChanges = function () {
               alert('test');
            }

我会很感激任何建议

【问题讨论】:

  • 您是否尝试过使用$apply?也可以尝试在link 函数中绑定事件
  • 是的,我试过了:$scope.onCancelChanges(); $scope.$apply();
  • 创建一个复制问题的演示
  • 我认为你应该在link函数中这样做

标签: javascript angularjs


【解决方案1】:

如果你想在范围内调用一个函数,它必须像这样提供:

<button class="k-grid-cancel-changes" on-cancel-changes="onCancelChanges()">test</button>

演示:http://plnkr.co/edit/8vQ1wmdriGrDFGZwhqW2?p=preview

如果由于某种原因您不能修改 HTML 代码(例如,它是由 Kendo 动态呈现的)并且不能添加属性,那么您只能通过 $parent 范围引用访问要调用的函数:

$scope.$parent.onCancelChanges();

演示:http://plnkr.co/edit/tpEEZs9VQunKXABud9yN?p=preview

最后,如果你的指令的独立范围不是主要的,那么你可以简单地调用函数,因为它是相同的范围:

.directive('kGridCancelChanges', function() {
    return {
        restrict: 'C',
        controller: function($scope, $element, $attrs, $location) {
            $element.click(function() {
                $scope.onCancelChanges();
            });
        }
    }
});

演示:http://plnkr.co/edit/0OmlCJ6SgYU2GQRyBgYj?p=preview

【讨论】:

  • 嗨,$scope.$parent.onCancelChanges();似乎有效,但我认为使用 $parent 是一种不好的做法?
  • 是的,我会避免使用$parent。只是向您解释您的选择。我会选择 #1 或 #3。
  • 我已经删除了隔离范围,它终于可以工作了。谢谢你。在这种情况下我应该使用隔离范围的任何原因?
  • 如果您只需要创建一个事件处理程序,那么您不需要隔离范围。如果你指令要创建一些范围变量,你会使用它。
  • 是的,你最好使用link函数,这是我们通常将事件处理程序绑定到DOM的地方。
【解决方案2】:

你可以像这样创建你的指令:

app.directive('myDir', function () {

    return {
        restrict: 'C',
        scope: {
            foo: '&'
        },
        link: function(scope,elem){
            elem.on('click',function(){
               scope.foo(); 
            });
        }};

});

如果需要,也可以使用 controller 函数而不是 link

    controller: function($scope,$element){
        $element.on('click',function(){
           $scope.foo(); 
        });
    }};

请注意,angular 的jqLite 没有element.click 功能。

这里是小提琴: http://jsfiddle.net/cxo77xb4/2/

【讨论】:

  • 谢谢你,举个例子。我确定我将来会使用它,但在这种情况下我无法修改 html
  • @witpo 您不必修改 html。只需将foo 更改为onCancelChanges
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多