Javascript 将范围值从指令传递给控制器-AngularJS
我有一个带有倒计时的小脚本,它是通过Javascript 将范围值从指令传递给控制器-AngularJS,javascript,html,angularjs,Javascript,Html,Angularjs,我有一个带有倒计时的小脚本,它是通过指令创建的,如果控制器中的$scope值为真,它就会启动。这是html代码: <countdown from="3" start-if="{{startCountdown}}"></countdown> 倒计时工作正常,但在控制器内,如果$scope.count===0,则应该有一个警报(),但它不工作 这是一个完整的代码。您知道如何将$scope.count的值传递给控制器并解决此问题吗?提前感谢您的回复 I.子范围指令。 您并没有
指令创建的
,如果控制器
中的$scope
值为真
,它就会启动。这是html
代码:
<countdown from="3" start-if="{{startCountdown}}"></countdown>
倒计时工作正常,但在控制器内
,如果$scope.count===0
,则应该有一个警报()
,但它不工作
这是一个完整的代码。您知道如何将
$scope.count的值传递给控制器
并解决此问题吗?提前感谢您的回复 I.子范围指令。
您并没有创建隔离作用域,所以最简单的解决方案是从控制器中的
属性和initcount
作用域变量中删除。因此:
//controller code
//init variable
$scope.count=3;
//directive code
//manipulate variable
$scope.count--;
不带隔离作用域(子作用域)的指令示例:
var-app=angular.module(“app”,[]);
app.controller(“controller”,函数($scope,$timeout){
$scope.count=2;
$scope.start=false;//开始倒计时标志
$scope.$watch(“计数”),函数(val){
log(“计数更改为:“+val”);
});
});
app.directive(“myDirective”,函数($timeout){
返回{
限制:“E”,
模板:“{count}}”,
链接:功能(范围){
scope.count++;//示例更改
$timeout(function(){scope.count++;},2000);//示例更改
作用域:$watch(“开始”,函数(){
//在这里,我们观察start scope变量的变化
//这里开始倒计时
});
}
}
});代码>
I.子范围指令。
您并没有创建隔离作用域,所以最简单的解决方案是从控制器中的
属性和initcount
作用域变量中删除。因此:
//controller code
//init variable
$scope.count=3;
//directive code
//manipulate variable
$scope.count--;
不带隔离作用域(子作用域)的指令示例:
var-app=angular.module(“app”,[]);
app.controller(“controller”,函数($scope,$timeout){
$scope.count=2;
$scope.start=false;//开始倒计时标志
$scope.$watch(“计数”),函数(val){
log(“计数更改为:“+val”);
});
});
app.directive(“myDirective”,函数($timeout){
返回{
限制:“E”,
模板:“{count}}”,
链接:功能(范围){
scope.count++;//示例更改
$timeout(function(){scope.count++;},2000);//示例更改
作用域:$watch(“开始”,函数(){
//在这里,我们观察start scope变量的变化
//这里开始倒计时
});
}
}
});代码>
您可以使用$broadcast使用相同的代码来实现这一点
controller: function($scope, $element, $attrs, $rootScope) {
$scope.count = $attrs.from;
function countdown(){
var intervalID = $interval(function() {
$rootScope.$broadcast('counterVal',{
countVal:$scope.count
});
if ($scope.count > 0) {
$scope.count--;
} else {
$interval.cancel(intervalID);
}
}, 1000);
}
$attrs.$observe('startIf', function(value) {
if (value) {
countdown();
}
});
}
请找到正在工作的plunker您可以使用$broadcast使用相同的代码来实现这一点
controller: function($scope, $element, $attrs, $rootScope) {
$scope.count = $attrs.from;
function countdown(){
var intervalID = $interval(function() {
$rootScope.$broadcast('counterVal',{
countVal:$scope.count
});
if ($scope.count > 0) {
$scope.count--;
} else {
$interval.cancel(intervalID);
}
}, 1000);
}
$attrs.$observe('startIf', function(value) {
if (value) {
countdown();
}
});
}
请查找正在工作的plunker看起来您正在使用此指令中的父作用域,即该指令的非隔离作用域,因为您在上面的指令代码中没有作用域:{…}。这意味着您应该能够简单地在控制器中放置$scope.$watch('count',…)来监视scope变量的更改。如果要使用独立作用域,则可以在指令中放置方法绑定作用域:{countdown:'&},然后可以在控制器中设置该方法的绑定,然后从指令中调用该方法。看起来您正在使用该指令中的父作用域,也就是说,不是指令的独立作用域,因为上面的指令代码中没有作用域:{…}。这意味着您应该能够简单地在控制器中放置$scope.$watch('count',…)来监视scope变量的更改。如果要使用隔离作用域,则可以在指令中放置方法绑定作用域:{countdown:'&},然后可以在控制器中设置该方法的绑定,然后从指令中调用该方法。您的解决方案似乎合理,但是,如果应用于指令的属性
,您是否可以通过修改start来编辑该文件?@d_z90 i添加在第一个代码示例变量start中。所以,在控制器中创建变量,然后在指令中观察它,在回调中,您可以运行倒计时。海报没有问如何将变量从指令传递到控制器吗?这显示了相反的ie:从控制器到指令。您的解决方案似乎合理,但如果应用于指令的属性也修改start,您能编辑文件吗?@d_z90 i添加在第一个代码示例变量start中。所以,在控制器中创建变量,然后在指令中观察它,在回调中,您可以运行倒计时。海报没有问如何将变量从指令传递到控制器吗?这显示了相反的ie:从控制器到指令。Maciej解决方案也是正确的,但这更好,因为它将范围
用作隔离。谢谢你,伙计!Maciej解决方案也是正确的,但这更好,因为它将范围
用作隔离。谢谢你,伙计!