我编写了两个简单的日期选择器指令,这些指令从最终用户的透视功能完全相同。您可以在http://jsbin.com/rapey/2/edit和http://jsbin.com/vuq/1/edit查看它们的工作方式。第一个使用新范围的方式是这样编码的:
<div ng-controller='cntrl'>
<br>
Date in controller: {{date}}<br><br>
<!-- <div date="date" datedirec ></div> -->
<div date="date" datedirec ></div>
</div>
var myMod = angular.module('app', []);
myMod.controller('cntrl', function ($scope) {
$scope.date = '1/1/2000';
});
myMod.directive('datedirec', function () {
return {
restrict: 'A',
//scope:{date:'='},
scope:true,
template: "<div>Date: <input type='text' ng-model='date_value'/>" +
"<button ng-click='updateDate()'>Update Date</button> </div>",
controller: function($scope, $element){
$scope.date_value=$scope.date;
$scope.updateDate = function(){
//$scope.date=angular.copy($scope.date_value);
$scope.$parent.date = angular.copy($scope.date_value);
};
}
};
});
第二种方法的编码方式与第一种方法完全相同。但是它不使用新范围,而是使用隔离范围。每个例子之间只有三条小线差异(见上面的评论)。
这是第一种方法(它将新范围与$ scope。$ parent结合使用):http://jsbin.com/rapey/2/edit
以下是第二种方法(它使用隔离范围):http://jsbin.com/vuq/1/edit
我的问题是,是否不应使用其中一种方法。
答案 0 :(得分:3)
您应该尽可能使用隔离范围,因为这会创建松散耦合的组件。通过使用隔离范围,即使应用程序其他部分中的对象发生更改,也可以确保指令继续运行。使用子范围时(scope: true
创建一个父范围的子范围),您假设父组件始终具有date
。如果您碰巧尝试在没有date
属性的组件中使用您的指令,或者date
属性更改为currentDate
,那么您的指令将失败。