我正在开发一个指令,该指令根据在模板中定义的click事件(ng-
click)来显示和隐藏其内容。在某些使用该指令的视图上,我希望能够知道该指令当前是显示还是隐藏其内容,因此我可以响应DOM更改。该指令具有单独的作用域,当该指令被“切换”时,我试图通知父作用域。我正在尝试通过将回调函数传递给使用该指令的指令来实现此目的,该指令可以在指令的状态更改(即隐藏或显示)时调用
我不确定该指令的状态(隐藏或显示)存储在该指令的隔离范围中,并且是在ng-
click之后确定的,因此我不确定该如何正确实现。因此,我需要从指令中而不是从视图中调用父作用域的函数。
举例说明,这将使WAAY更有意义。这是一个笨拙的演示我想做的事情:
http://plnkr.co/edit/hHwwxjssOKiphTSO1VIS?p=info
var app = angular.module('main-module',[])
app.controller('MainController', function($scope){
$scope.myValue = 'test value';
$scope.parentToggle = function(value){
$scope.myValue = value;
};
});
app.directive('toggle', function(){
return {
restrict: 'A',
template: '<a ng-click="toggle();">Click Me</a>',
replace: true,
scope: {
OnToggle: '&'
},
link: function($scope, elem, attrs, controller) {
$scope.toggleValue = false;
$scope.toggle = function () {
$scope.toggleValue = !$scope.toggleValue;
$scope.OnToggle($scope.toggleValue)
};
}
};
});
我对Angular比较陌生。首先这是一个坏主意吗?我应该使用服务还是其他东西而不是传递函数引用?
谢谢!
更新资料
您还可以使用&
绑定根作用域的功能(实际上是的目的&
)。
为此,需要稍微更改指令:
app.directive('toggle', function(){
return {
restrict: 'A',
template: '<a ng-click="f()">Click Me</a>',
replace: true,
scope: {
toggle: '&'
},
controller: function($scope) {
$scope.toggleValue = false;
$scope.f = function() {
$scope.toggleValue = !$scope.toggleValue;
$scope.toggle({message: $scope.toggleValue});
};
}
};
});
您可以这样使用:
<div toggle="parentToggle(message)"></div>
朋克
您可以使用绑定功能=
。另外,请确保您的范围和标记中的属性名称匹配(AngularJS将CamelCase转换为 破折号 )。
之前:
scope: {
OnToggle: '&'
}
后:
scope: {
onToggle: '='
}
此外,请勿on-toggle="parentToggle({value: toggleValue})"
在主模板中使用。您不希望调用函数,而只是将函数的
指针 传递给指令。
朋克
问题内容: 我不确定这是这样做的方法,但是我的目标是: 我有一个家长指令 在父指令的代码块中,我有一个子指令,它将从用户那里获得一些输入 子指令将在父指令的范围内设置一个值 我可以从那里拿走 当然,问题在于父和子指令是同级的。所以我不知道该怎么做。注意-我不想在 小提琴:http : //jsfiddle.net/rrosen326/CZWS4/ 的HTML: Java脚本 问题答案: 如果要进行
问题内容: 如何从其父范围调用在子范围中定义的方法? http://jsfiddle.net/wUPdW/ 问题答案: 您可以从父母到孩子使用: 工作jsfiddle:http : //jsfiddle.net/wUPdW/2/ 更新 :还有另一个版本,耦合性更低,更易于测试: jsfiddle:http : //jsfiddle.net/uypo360u/
属性 值发生变化后,必须立刻上报最新的值。此外,属性可以选择周期性上报,或一次性上报。 周期性上报时,每个属性的上报周期可以不同,最短周期不得低于一小时,周期要注意并发性问题,如果某一产品定在每天晚上8点准时上报属性,就有可能导致云端处理不过来而丢包,造成严重的并发性问题。 另外,因为属性在云端也需要维持一个最新属性值,所以重要的属性采用request通信方式已保证状态同步,可用在APP设备列表的
问题内容: 我想编写带有隔离范围的指令,但也想使该范围可用于父范围的控制器。我找到了这个解决方案: 参见柱塞。 我觉得这有点丑陋,因为它涉及用HTML编写属性,而在控制器的代码中,您无法确定范围属性的来源。有一个更好的方法吗? 编辑: 此外,似乎在运行控制器“ Main”时$ scope.popup甚至不可用。指令的链接功能尚未执行? 问题答案: 为了保持适当的关注点分离,您不应该混合作用域。更不
问题内容: 我正在尝试从链接函数中查看模型值。 当我在控制器内更改模型值时,不会触发$ watch函数。 小提琴:http : //jsfiddle.net/dkrotts/BtrZH/4/ 我在这里想念什么? 问题答案: 问题是您输入的内容等于“ myModel”。您的范围中没有“ myModel”绑定。您要“建模”。那就是您指令范围内的内容。参见http://jsfiddle.net/BtrZ
如果不使用隔离作用域,我似乎找不到从指令中调用父作用域上的函数的方法。我知道如果我使用隔离作用域,我可以使用“ 在这个简单的示例中,我想显示一个JavaScript确认对话框,并且只有在确认对话框中单击“确定”时才调用doIt()。使用隔离范围很简单。指令如下所示: 但问题是,因为我使用的是隔离作用域,所以上面示例中的ng hide不再针对父作用域执行,而是在隔离作用域中执行(因为在任何指令上使用