我似乎无法find一种方法来调用父指定范围内的function,而不使用隔离范围。 我知道,如果我使用隔离作用域,我可以在隔离中使用“&”来访问父作用域上的函数,但是在不需要时使用隔离作用域会产生后果。 考虑下面的HTML: <button ng-hide="hideButton()" confirm="Are you sure?" confirm-action="doIt()">Do It</button> 在这个简单的例子中,我想显示一个JavaScript确认对话框,只有在确认对话框中点击“OK”才能调用doIt()。 使用隔离范围很简单。 该指令看起来像这样: .directive('confirm', function () { return { restrict: 'A', scope: { confirm: '@', confirmAction: '&' }, link: function (scope, element, attrs) { element.bind('click', function (e) { if (confirm(scope.confirm)) { scope.confirmAction(); } }); } }; }) 但问题是,因为我使用的是独立作用域,所以上例中的ng-hide不再针对父作用域执行 ,而是在独立作用域中执行(因为在任何指令上使用隔离作用域都会导致该元素的所有指令使用隔离的范围)。 上面这个示例中的一个jsFiddle ,其中的ng-hide不起作用。 (请注意,在这个小提琴中,当您在input框中input“是”时,该button应该隐藏)。 另一种select是不使用隔离的范围 ,这实际上是我真正想要的,因为这个指令的范围不需要被隔离。 我唯一的问题是, […]
在指令中创build一个隔离范围让我们将外部范围映射到内部范围 。 我们已经看到了六种不同的方式来映射到属性: =属性 &ATTR @attr = & @ 每个这些示波器映射选项都做什么?
将“当前” $scope传递给AngularJS服务是正确的吗? 我在我有一个$服务的情况下,知道它只被一个控制器消耗,我想在$ service方法本身中引用控制器的作用域。 这在哲学上是正确的吗? 或者我最好把事件广播到$ rootScope,然后让我的控制器听取他们的意见?
我有一个表单指令,使用隔离范围指定的callback属性: scope: { callback: '&' } 它位于ng-repeat内部,所以我传递的expression式包含作为callback函数参数的对象的id : <directive ng-repeat = "item in stuff" callback = "callback(item.id)"/> 当我完成了指令,它从它的控制器函数中调用$scope.callback() 。 对于大多数情况下,这是好的,这是我想要做的,但有时我想从directive本身添加另一个参数。 是否有一个angular度expression式可以允许: $scope.callback(arg2) ,导致callback被调用arguments = [item.id, arg2] ? 如果不是的话,最简单的方法是什么? 我发现这个工作: <directive ng-repeat = "item in stuff" callback = "callback" callback-arg="item.id"/> 同 scope { callback: '=', callbackArg: '=' } 和指令调用 $scope.callback.apply(null, [$scope.callbackArg].concat([arg2, arg3]) ); 但我不认为它特别整齐,而且涉及到在隔离范围内增加额外的东西。 有没有更好的办法? 这里的游戏机操场 […]
我想观察字典中的更改,但由于某种原因,不会调用callback函数。 这是我使用的一个控制器: function MyController($scope) { $scope.form = { name: 'my name', surname: 'surname' } $scope.$watch('form', function(newVal, oldVal){ console.log('changed'); }); } 这里是小提琴: http : //jsfiddle.net/Y8ByG/ 我希望每次更改名称或姓氏时都会触发$ watchcallback,但不会发生。 什么是正确的方法来做到这一点?
既然$broadcast和$emit之间的性能差异已经被消除了,那么是否有理由select$scope.$emit to $rootScope.$broadcast ? 他们是不同的,是的。 $emit只限于作用域层次结构(向上) – 如果它符合你的devise,这可能是好的,但在我看来,这是一个相当随意的限制。 $rootScope.$broadcast适用于所有select收听该事件,这在我看来是一个更明智的限制。 我错过了什么吗? 编辑: 为了澄清回答,调度的方向不是我所追求的问题。 $scope.$emit向上发送事件, $scope.$broadcast – 向下。 但为什么不总是使用$rootScope.$broadcast来达到所有预期的监听器呢?
我在我的.html页面中有一个下拉列表, 落下: <select ng-model="blisterPackTemplateSelected" data-ng-options="blisterPackTemplate as blisterPackTemplate.name for blisterPackTemplate in blisterPackTemplates"> <option value="">Select Account</option> </select> 我想在用户select一个值时执行一个动作。 所以在我的控制器中,我做了: 控制器: $scope.$watch('blisterPackTemplateSelected', function() { alert('changed'); console.log($scope.blisterPackTemplateSelected); }); 但是,更改下拉列表中的值不会触发代码: $scope.$watch('blisterPackTemplateSelected', function() 因此,我在select标签上尝试了另一个方法: ng_change = 'changedValue()' 和 function: $scope.changedValue = function() { console.log($scope.blisterPackTemplateSelected); } 但是blisterPackTemplateSelected存储在一个子范围中。 我读了父母不能访问子范围。 当下拉列表中的选定值更改时,执行某些操作的正确/最佳方式是什么? 如果是方法1,我在做什么错我的代码?
我有两个控制器一个包裹在另一个。 现在我知道子范围从父范围inheritance属性,但有没有办法更新父范围variables? 到目前为止,我还没有遇到任何明显的解决scheme。 在我的情况下,我有一个表格中的日历控制器。 我想从父范围(这是表单)更新开始date和结束date,以便表单在提交时具有开始date和结束date。
<a ng-href="#" class="navbar-brand" title="home" data-translate>PORTAL_NAME</a> 我想重新加载页面。 我该怎么做?
当使用controller as语法时如何订阅属性更改? controller('TestCtrl', function ($scope) { this.name = 'Max'; this.changeName = function () { this.name = new Date(); } // not working $scope.$watch("name",function(value){ console.log(value) }); }); <div ng-controller="TestCtrl as test"> <input type="text" ng-model="test.name" /> <a ng-click="test.changeName()" href="#">Change Name</a> </div>