尽管只添加了一个指令,但多个指令错误

Posted

技术标签:

【中文标题】尽管只添加了一个指令,但多个指令错误【英文标题】:Multiple directives error though there is only one added 【发布时间】:2016-10-30 00:58:35 【问题描述】:

创建指令时出现以下错误。

我收到以下错误

13642 错误:[$compile:multidir] 多个指令 [myDirective (module: myApp), myDirective (module: myApp)] 要求模板:

我是指令创建的新手。你能解释一下吗-

    虽然我只使用一个指令,但它是在说多个指令。这里还有哪些其他指令? 如何解决此错误?

更新

删除templateUrl后,错误消失了。但该值未呈现。正如答案中提到的,这是因为创建了isolated scope 而不是shared scope

<html>
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular-resource.js"></script>
    
    <script type="text/javascript">
        //defining module
        var app = angular.module('myApp', ['ngResource']);

        //defining controller
        app.controller('myController', function ($scope) 
	
            $scope.myVal = 'A';

        );

 app.directive('myDirective', function () 

    return 
        restrict: 'EA',      
        scope: title: '@' ,
        template: '<div> myVal </div>',
        templateUrl: 'mytemplate.html',
        link: function ($scope, element, attrs)   
    
);


    </script>
</head>
<body ng-app="myApp">
    <div ng-controller="myController">
       <div my-directive></div>
    </div>
</body>
</html>

【问题讨论】:

为什么要有模板和templateUrl?应该只需要一个或另一个。 读取错误页面(所有内容)。它用清晰的英语解释了为什么。 docs.angularjs.org/error/$compile/… @dfsq 我刚读过。不过,它并没有说一个带有多个模板的指令会导致这个问题。 【参考方案1】:

您正在尝试为同一个指令(template 和 templateUrl)定义两个模板。删除一个或另一个,它将解决您的错误


编辑:

当您在指令中指定本地范围时,您正在创建一个隔离范围。 This 是了解更多关于 Angular 指令范围的好资源

【讨论】:

删除了templateURL,错误消失了。但它没有显示来自控制器的值 - myVal。知道为什么吗?【参考方案2】:

当您不小心定义了两个具有相同名称的指令/组件时,可能会发生类似的错误。然后 Angular 会尝试将两者都应用到元素上,错误会显示相同的名称,而实际上它们是不同的指令。

【讨论】:

以上是关于尽管只添加了一个指令,但多个指令错误的主要内容,如果未能解决你的问题,请参考以下文章

Angular 属性指令 - prod 构建错误,预期 1 个参数但得到 0

错误多个指令 [bar, bar] 在使用自定义指令和 angular-bootstrap 时要求模板

未捕获的错误:模块“AppModule”导入的意外指令“MatFormField”。请添加@NgModule 注释

错误:formControlName 必须与父 formGroup 指令一起使用。您需要添加一个 formGroup 指令 - Angular 反应式表单

7.5 pragma 指令

FreeMarker学习(常用指令)