Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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_Angularjs_Angularjs Directive - Fatal编程技术网

Javascript AngularJS指令隔离作用域行为

Javascript AngularJS指令隔离作用域行为,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我正在学习一些教程,试图巩固我对隔离范围的理解,我遇到了一些问题。我有一个很高的概念,但我试图证明一些我不理解的行为是正确的。按照我的理解,在高层次上,所附选项的工作方式如下: @-允许您输入字符串 &-提供单向数据绑定 =-提供双向数据绑定 因此,考虑到以下准则: <div ng-app="choreApp"> <div ng-controller="ChoreCtrl"> <kid done="logChore(chore)"></kid

我正在学习一些教程,试图巩固我对隔离范围的理解,我遇到了一些问题。我有一个很高的概念,但我试图证明一些我不理解的行为是正确的。按照我的理解,在高层次上,所附选项的工作方式如下:

@-允许您输入字符串 &-提供单向数据绑定 =-提供双向数据绑定

因此,考虑到以下准则:

<div ng-app="choreApp">
  <div ng-controller="ChoreCtrl">
    <kid done="logChore(chore)"></kid>
  </div>
</div>

var app = angular.module('choreApp', []);

app.controller("ChoreCtrl", function($scope){
  $scope.logChore = function(chore){
    alert(chore + " is done!");
  };
});

app.directive("kid", function() {
  return {
    restrict: "E",
     scope: {
        done: "&"
     },
    template: '<input type="text" ng-model="chore">' +
      '{{chore}}' +
      '<div class="button" ng-click="done({chore: chore})">I\'m done</div>'
  };
});

var-app=angular.module('choreApp',[]);
app.controller(“ChoreCtrl”,函数($scope){
$scope.logChore=函数(chore){
警报(杂务+“完成!”);
};
});
应用指令(“kid”,函数(){
返回{
限制:“E”,
范围:{
完成:“&”
},
模板:“”+
“{{chore}}”+
“我做完了”
};
});
上面的连接正常,使用“&”logChore函数工作,一切正常

“@”不起作用,正如预期的那样,因为它只是在字符串中读取,当我单击“无任何事情发生”时


但是,我也希望“=”可以正常工作,因为它只是一个双向绑定,但是实际发生的情况是函数执行了三次,而我没有执行任何操作(单击),然后它似乎正常工作。为什么函数会执行三次?

当您对
done=“logChore(chore)”
使用双向绑定(=”)时,调用
logChore(chore)
的结果被分配给
done
-而不是函数本身(就像
&
那样)

因此,每当Angular调用
$watch
以查看它正在监视的任何内容是否已更改时,就会调用函数
logChore(chore)
。由于脏检查,
$watch
通常会在每个
$digest
循环中多次计算监视列表-这就是为什么您看到3次执行(并且在触发
$digest
的任何事件发生时,您都会看到更多执行)

要在使用
=
时传入函数本身,可以执行以下操作:

<kid done="logChore"></kid>
这是它的工作原理

另外,我不认为
@
是传递字符串,而是更广泛地认为它是单向数据绑定。这是单向的,因为父范围的更改将反映在指令中,但指令隔离范围的更改不会反映在父范围中

ng-click="done(chore)"