Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.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 指令中的访问范围控制器变量_Javascript_Angularjs_Angular Directive - Fatal编程技术网

Javascript 指令中的访问范围控制器变量

Javascript 指令中的访问范围控制器变量,javascript,angularjs,angular-directive,Javascript,Angularjs,Angular Directive,我想访问指令链接属性中的范围变量total 尽管触发了mouseDown事件时total值正在更新,但$scope.total没有更改 这是代码 功能:当鼠标落在相应的框上时,总量会发生变化 var-app=angular.module(“billModule”,[]); 应用控制器(“billController”,功能($scope){ $scope.total=0.0; }); 应用指令(“菜单”,功能($document){ 返回{ 限制:“EA”, 替换:正确, 链接:功能(范围、元

我想访问指令链接属性中的范围变量
total

尽管触发了mouseDown事件时total值正在更新,但$scope.total没有更改

这是代码

功能:当鼠标落在相应的框上时,总量会发生变化

var-app=angular.module(“billModule”,[]);
应用控制器(“billController”,功能($scope){
$scope.total=0.0;
});
应用指令(“菜单”,功能($document){
返回{
限制:“EA”,
替换:正确,
链接:功能(范围、元素、属性){
on(“mousedown”,function(){
总范围+=数量(附加成本);
//console.log(“总计为”+scope.total);
});
},
模板:函数(元素,属性){
返回“+attr.item+”;
}
}
})
.box{
宽度:132px;高度:38px;背景色:红色;光标:指针;边框:凹槽;文本对齐:居中;填充顶部:5px;字体大小:33px;颜色:白色;
}
.box:悬停{
/*背景颜色:蓝色*/
边框:插图;
}

{{总计|货币:'$':2}

Angular不知道该更改,因为它是使用外部事件处理程序而不是Angular事件处理程序(例如ngClick)进行的。要使angular了解更改,请使用
范围将其包装。$apply

scope.$apply(function() {
    scope.total += Number(attr.cost);
});

如果您使用的是angular 1.3或更高版本,请使用
作用域。$applyAsync
,因为它的性能更高。

angular没有意识到这一变化,因为它是使用外部事件处理程序而不是angular事件处理程序(例如ngClick)生成的。要使angular了解更改,请使用
范围将其包装。$apply

scope.$apply(function() {
    scope.total += Number(attr.cost);
});
如果您使用的是angular 1.3或更高版本,请使用
scope.$applyAsync
,因为它性能更好。

使用“scope.$digest();”在“scope.total+=数量(attr.cost);”之后您的总数将在模板中更新。请参阅下面的plnkr

代码:

var-app=angular.module(“billModule”,[]);
应用控制器(“billController”,功能($scope){
$scope.total=0.0;
});
应用指令(“菜单”,功能($document){
返回{
限制:“EA”,
替换:正确,
链接:功能(范围、元素、属性){
on(“mousedown”,function(){
总范围+=数量(附加成本);
范围。$digest();
//console.log(“总计为”+scope.total);
});
},
模板:函数(元素,属性){
返回“+attr.item+”;
}
}
});
使用“scope.$digest();”在“scope.total+=数量(attr.cost);”之后您的总数将在模板中更新。请参阅下面的plnkr

代码:

var-app=angular.module(“billModule”,[]);
应用控制器(“billController”,功能($scope){
$scope.total=0.0;
});
应用指令(“菜单”,功能($document){
返回{
限制:“EA”,
替换:正确,
链接:功能(范围、元素、属性){
on(“mousedown”,function(){
总范围+=数量(附加成本);
范围。$digest();
//console.log(“总计为”+scope.total);
});
},
模板:函数(元素,属性){
返回“+attr.item+”;
}
}
});

添加范围。$apply();在directiveadd作用域中的链接中有console之后。$apply();当我们访问外部作用域时,是否必须使用
$apply
?当我们更改作用域属性时,需要通知angular,以便它可以启动摘要循环,并对更改作出反应。为此,我们使用$apply。但是我们在controller()中没有使用$apply,为什么?如果您使用角度方法或事件处理程序,例如
$http
ngClick
,它们在内部使用
$apply
启动摘要循环。如果您要使用
元素。在控制器中不使用
$apply
上,您也会遇到同样的问题。当我们在外部访问作用域时,是否必须使用
$apply
?当我们更改作用域属性时,我们需要通知angular,以便它可以启动摘要循环,并对更改做出反应。为此,我们使用$apply。但是我们在controller()中没有使用$apply,为什么?如果您使用角度方法或事件处理程序,例如
$http
ngClick
,它们在内部使用
$apply
启动摘要循环。如果在控制器中使用
元素.on而不使用
$apply
,则会出现相同的问题。