当前位置: 首页 > 面试题库 >

在指令中包含ng-click

伏德义
2023-03-14
问题内容

我正在构建AngularJS指令。我希望该指令包装其中包含ng-click的其他内容。单击后,结果按钮不执行任何操作。这是我尝试过的代码的简化版本:

(HTML)

<div ng-app="someapp">
    <div ng-controller="Ctrl1">
        <h2>Example</h2>
        <my-dir data-x="1">
            <button ng-click="refresh()" id="refresh1">Refresh</button>
        </my-dir>
        <my-dir data-x="2">
            <button ng-click="refresh()" id="refresh2">Refresh</button>
        </my-dir>
    </div>
</div>

(JavaScript)

var app = angular.module('someapp', []);

app.controller('Ctrl1', function($scope){ });

app.directive('myDir', function(){
    return {
        restrict: 'E',
        scope: {},
        template: '<div><p>Directive contents:</p><div ng-transclude></div></div>',
        transclude: true,
        link: function(scope, element, attrs){
            $scope.y = attrs.x+1;
            scope.refresh = function(){
                console.log("Refresh Called, y = ", $scope.y);
            }
        }
    };
});

如何更改它,以便该按钮实际触发$ scope.refresh()函数?

额外说明:

我需要该指令的本地对象信息(单个控制器中可以有多个该指令),因此我创建了一个新作用域。


问题答案:

就像dcodesmith指出的那样,包含在内的ng-
click将绑定到控制器的作用域,而不是指令的作用域。取决于您要执行的操作,您可能希望它是行为(由于被包含的内容不是指令的一部分,为什么要调用指令范围的方法?)。就个人而言,我将改为在控制器的作用域上声明该方法。

app.controller('Ctrl1', function($scope){ 
    $scope.refresh = function() {
        console.log("Refresh called.");
    };
});

在这种情况下,即使其中没​​有任何内容,您的指令也 声明隔离范围。

更新:根据您的评论,为什么不只将按钮包括在指令模板中?在这种情况下,它将已经与正确的范围相关联。

如果在某些情况下您不需要刷新按钮,则可以通过指令作为属性将其作为选项公开:

<my-dir show-button='true'></my-dir>

// directive scope
scope: {
    showButton: '='
}

我用这种方法遇到的最大问题是使用“双向绑定”运算符(=)将“ true”和“ false”视为表达式。我只是不太喜欢那种感觉。

无论如何,希望这可以解决您的问题…再说一遍,我是说这甚至不知道您所实现的实际上是否是刷新按钮,但是如果是,我将花一分钟时间考虑您是否真正需要一个“刷新”按钮。Angular擅长消除刷新按钮!

更新2:

我创建了一个plunkr,它显示了我认为我将如何处理您的情况,尤其是在重复使用任何其他控件的情况下:

http://plnkr.co/edit/FhrSwcrSZScvCfhtCSjn

在此示例中,两个按钮指令实际上是“
videoPlayer”指令的子代。它们的逻辑包含在该指令中,但是它们是分别实例化的,并且对于父指令而言不是必需的。“父母指令”(videplayer)只是公开了供“孩子”使用的API。同样不是说父方法是构造函数的方法,而不是作用域的方法。我认为这很奇怪,但这完全取自有角度的文档:

http://docs.angularjs.org/guide/directive(页面上的最后一个示例)

请注意,每个videoPlayer指令仍将具有其自己的隔离范围。



 类似资料:
  • 问题内容: 在以下情况下如何使用包含。目的是在html(部分)文件中使用标记,而不是在模板中(在指令内)定义标记。 我在这里找到了一个很棒的树指令。( 来源)原文: http //jsfiddle.net/n8dPm/ 我没有在指令中定义模板,而是尝试使用包含在内的内容。我还将Angular更新为1.2.0.rc2。更新时间:http://jsfiddle.net/aZx7B/2/ 低于错误 Ty

  • 问题内容: 有没有办法让DTColumnBuilder.newColumn.renderWidth包含自定义指令?这是我要实现的代码草案。 问题答案: 您可以在回调中包含单元格内容。这是一个非常简单的示例,该伪指令仅将文本着色为红色。很抱歉没有使用箭头功能:) 指令: 演示-> http://plnkr.co/edit/aok6SyWZlLaQv8UsEVIf?p=preview

  • 本文向大家介绍AngularJS ng-mousedown 指令,包括了AngularJS ng-mousedown 指令的使用技巧和注意事项,需要的朋友参考一下 AngularJS ng-mousedown 指令 AngularJS 实例 在鼠标按下时执行表达式: 定义和用法 ng-mousedown 指令用于告诉 AngularJS 鼠标在指定的 HTML 元素上按下时要执行的操作。 ng-m

  • 问题内容: 我正在尝试在ng-repeat中动态添加不同的指令,但是输出没有被解释为指令。 我在这里添加了一个简单的示例:http : //plnkr.co/edit/6pREpoqvmcnJJWzhZZKq 控制器: 指示: HTML: 如何通过ng-repeat 使角度拾取在中指定的指令? 问题答案: 我知道这是一个老问题,但是google将我带到了这里,但我不喜欢这里的答案。所以我创建了这个

  • 我是新的angularjs。我想动态添加指令到基于标题的div从控制器...下面是我尝试的... 以下是我使用的指令和工厂 下面是我如何使用ng repeat 这不管用

  • 问题内容: 我一直在研究修改AngularJS ng-click指令以添加一些其他功能。对于如何使用它,我有一些不同的想法,但是一个简单的想法是将Google Analytics(分析)跟踪添加到所有ng-clicks,另一个是防止双击。 为此,我的第一个想法是使用装饰器。所以像这样: 但这不会起作用,因为装饰器会在实例化时触发,而不是在满足指令中的表达式时触发。因此,在这种情况下,它将在加载带有