Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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_Angularjs Directive_Angularjs Scope - Fatal编程技术网

Javascript 定义隔离范围时,指令行为会发生变化

Javascript 定义隔离范围时,指令行为会发生变化,javascript,angularjs,angularjs-directive,angularjs-scope,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,我有一个javascript网格库的指令 我要做的是将所选行传递回控制器。所以我想使用隔离作用域(使用“=”)在控制器和指令之间实现双向绑定 如果我在没有任何范围声明的情况下定义指令,那么一切都可以正常工作: <slickgrid id="myGrid" data="names" selected-item="selectedItem"></slickgrid> app.directive('slickgrid', function() { return {

我有一个javascript网格库的指令

我要做的是将所选行传递回控制器。所以我想使用隔离作用域(使用“=”)在控制器和指令之间实现双向绑定

如果我在没有任何范围声明的情况下定义指令,那么一切都可以正常工作:

<slickgrid id="myGrid" data="names" selected-item="selectedItem"></slickgrid>

app.directive('slickgrid', function() {
  return {
  restrict: 'E',
  replace: true,
  //scope: {
  //  selectedItem: '='
  //},
  template: '<div></div>',
  link: function($scope, element, attrs) {
   ...
    var redraw = function(newScopeData) {
    grid.setData(newScopeData);
    grid.render();
};
$scope.$watch(attrs.data, redraw, true);

应用指令('slickgrid',函数(){
返回{
限制:'E',
替换:正确,
//范围:{
//选择编辑项:'='
//},
模板:“”,
链接:函数($scope,element,attrs){
...
var redraw=函数(newScopeData){
setData(newScopeData);
grid.render();
};
$scope.$watch(属性数据,重绘,真);
但是如果我取消注释上面的行(app.js中的第19-21行),它看起来像$scope.$watch,它正在监视attrs.data对象,正在调用redraw,但attrs.data正在作为未定义的对象传入

我的分析可能是错误的,但我不确定为什么定义范围会导致这种情况。有人能解释一下为什么会这样吗


.nathan.

如果定义了隔离作用域,则指令中的任何$watch都将查找隔离作用域上的
attrs.data
计算结果为的任何内容。
attrs.data
计算结果为字符串
names
,因此$watch将查找隔离作用域上不存在的
$scope.names
。(如果没有隔离作用域,该指令使用与MainCtrl相同的作用域,并且存在
$scope.names

要使用隔离作用域,您需要定义另一个隔离作用域属性以传入
名称

scope: {
  selectedItem: '=',
  data: '='
},
...
$scope.$watch('data', redraw, true);

HTML可以保持不变。

如果定义隔离作用域,则指令中的任何$watch都将在隔离作用域上查找
attrs.data
计算结果为的任何内容。
attrs.data
计算结果为字符串
names
,因此$watch在隔离作用域上查找
$scope.names
,这是什么esn不存在。(如果没有隔离作用域,指令使用与MainCtrl相同的作用域,并且存在
$scope.names
。)

要使用隔离作用域,您需要定义另一个隔离作用域属性以传入
名称

scope: {
  selectedItem: '=',
  data: '='
},
...
$scope.$watch('data', redraw, true);

HTML可以保持不变。

谢谢,我可以让它工作。但是,我仍然不清楚为什么数据范围需要用记号封装。现在我必须弄清楚为什么{selectedItem}在指令中选择新行时未更新!@nathasm,如果的第一个参数是字符串,则根据作用域对其求值,就像
ng click='someProperty=22'
ng model='someProperty'
ng show=“showIt”
。获取
{selectedItem}
要更新:
$scope.selectedItem=item;$scope.$apply()
。谢谢,我能够让它工作。但是,我仍然不清楚为什么数据范围需要用记号封装。现在我必须弄清楚为什么{{selectedItem}在指令中选择新行时未更新!@nathasm,如果的第一个参数是字符串,则根据作用域对其求值,就像
ng click='someProperty=22'
ng model='someProperty'
ng show=“showIt”
。获取
{selectedItem}
要更新:
$scope.selectedItem=item;$scope.$apply()