我想做这样的事情 fiddle,使文字消失,每次点击都会重新出现。
问题是,似乎在隔离范围内,您无法访问控制器范围。我在链接功能中解决了它,处理点击事件并使用范围设置我的“showMe”标记。$ apply ,如:
scope.$apply('showMe = false');
这是正确的方法还是有更优雅的方法?
答案 0 :(得分:5)
你去(http://jsfiddle.net/66d0t7k0/1/)
将您的点击处理程序放在链接功能中,并将showMe
公开给scope
app.directive('example', function () {
return {
restrict: 'E',
template: '<p ng-show=\"showMe\">Text to show</p><button ng-click=\"clickMe()\">Click me</button>',
scope: {
exampleAttr: '@'
},
link: function (scope) {
scope.clickMe = function () {
scope.showMe = !scope.showMe;
};
}
};
});
答案 1 :(得分:1)
要扩展apairet的答案,因为你的指令使用了一个独立的范围,你可以像这样处理模板本身的所有内容:
app.directive('example', function () {
return {
restrict: 'E',
template: '<p ng-show=\"showMe\">Text to show</p><button ng-init=\"showMe = false\" ng-click=\"showMe = !showMe\">Click me</button>',
scope: {
exampleAttr: '@'
},
link: function (scope) {
}
};
});
另一个考虑因素是使用ng-if而不是ng-show,因为在表达式求值为true之前,它不会在DOM中呈现元素。
答案 2 :(得分:0)
您可以通过设置scope:false隐藏指令中的范围 然后,您可以将所有功能放在主控制器范围
中angular.module('appMyApp').directive('appMyAppItem', function() {
return {
transclude: true,
templateUrl: 'link/to/url',
controller: 'appMyAppController',
scope: false
}
});
angular.module('appMyApp').controller('appMyAppController', ['$scope', function($scope){
$scope.showItem = true;
$scope.toggleItem = function(){
$scope.showItem = !$scope.showItem;
};
}]);
希望这有帮助