我对控制器中 $ scope 的使用以及指令中范围的使用感到有些困惑。请验证我的理解是否正确(并提供了一些替代方法)。
我们说我有一个HTML:
<div ng-controller="app1_Ctrl">
.
.
.
<input type="text" ng-model="value"/>
<input type="checkbox" />
<button ng-click="submit()"></button>
</div>
我的main.js
(function() {
angular.module('mainApp', ['app1']);
})();
我的app1看起来像这样(基于AngularJS官方文档here)
(function() {
var app = angular.module('app1', []);
app.controller('app1_Ctrl', ["$scope", function($scope) {
.
.
.
}]);
app.directive('app1_Dir1', [function() {
function link(scope, element, attr) {
scope.$watch(attr.someAttrOfCheckBox, function() {
// some logic here
});
function submit() {
// some logic here
}
}
return link;
}]);
})();
$ scope.value如何在指令范围内传递,以便我可以在那里进行一些操作? ng-click会在指令链接中触发函数submit()吗?使用范围是否正确。$ watch在checkbox元素中侦听一个动作(当然是勾选或未勾选)?
非常感谢能够解释的人。
答案 0 :(得分:4)
默认情况下,指令范围是控制器$ scope;但这意味着该指令直接依赖于您的控制器,并且您需要为要使用的指令的每个实例使用不同的控制器。通常认为最佳做法是隔离指令范围,并专门定义要从控制器传递的变量。 为此,您需要在指令中添加范围语句:
scope {
label :'@',
context : '=',
function : '&'
}
并更新您的观点:
<my-directive label="labelFromController" context="ctxtFromController" function="myFunction()" ></my-directive>
符号表示您希望传递的内容:@
用于单向绑定(作为指令中的字符串),=
用于对象的双向绑定(它使指令能够更新控制器中的某些内容),&
用于传递函数。
Angular doc https://docs.angularjs.org/guide/directive最好地解释了许多其他选项和细微之处。还有一些不错的教程(例如http://www.sitepoint.com/practical-guide-angularjs-directives/)
scope.submit = function() ...
。一些额外的想法:
template
字段中,或打包在指令中templateUrl
字段引用的单独HTML文件中。 restrict
字段调用的方式)。也许您已经省略了包含指令HTML的行,但就目前而言,您的指令并没有做任何事情。