Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将范围值从指令传递给控制器-AngularJS_Javascript_Html_Angularjs - Fatal编程技术网

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.子范围指令。

您并没有创建隔离作用域,所以最简单的解决方案是从控制器中的
属性和init
count
作用域变量中删除
。因此:

//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.子范围指令。

您并没有创建隔离作用域,所以最简单的解决方案是从控制器中的
属性和init
count
作用域变量中删除
。因此:

//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解决方案也是正确的,但这更好,因为它将
范围
用作隔离。谢谢你,伙计!