Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.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 - Fatal编程技术网

Javascript 将数组作为指令参数传递

Javascript 将数组作为指令参数传递,javascript,angularjs,Javascript,Angularjs,据推测,我有一个范围指令 scope: { columns: '=', } 我怎样才能做到这一点 <my-directive columns="[{ field:'id', displayName: 'ID' }, { field:'title', displayName: 'Title' }, { field:'address', displayName: 'Addre

据推测,我有一个范围指令

scope: {
   columns: '=',
}
我怎样才能做到这一点

<my-directive columns="[{ field:'id', displayName: 'ID' },
                            { field:'title', displayName: 'Title' },
                            { field:'address', displayName: 'Address' },
                            { field:'city', displayName: 'City' }]" />
这是指令的模板:

<div ng-grid="dataGridOptions">
</div>

好吧,我想在DOM中初始化数据的一种方法是使用ng init指令。 所以这个指令看起来像

app.directive('testd', function() {
  return {
    scope: {
      options: "=ngInit"
    },
    link: function(scope, e, a) {
      console.log('test', scope.options);
    },
    template: 'test'
  };
});
您可以通过ng init提供阵列

<div testd ng-init="[{ field:'id', displayName: 'ID' },
                            { field:'title', displayName: 'Title' },
                            { field:'address', displayName: 'Address' },
                            { field:'city', displayName: 'City' }]"></div>

示例演示:


还有一种方法是通过属性传递它。虽然它将被视为字符串,但您可以使用eval()将其转换为对象并将其分配给范围变量。Plnkr也同样更新。包含
列:“@”
并使用
eval(attrs.columns)
将其转换为数组

您在一条注释中提到,您的指令引发了一个
非指定
错误。当指令试图修改使用
=
符号定义的隔离作用域时,会发生
非指定
错误,其中指定的属性是非双向数据绑定的表达式(不是作用域变量)

可能在指令中的某个地方,您可能试图直接更改
scope.columns
,例如,
scope.columns=[]
或通过
=
符号指定的任何其他作用域属性。试着去掉它,它可能会解决你的问题

更新:

正在尝试更改此选项:

 dataGridOptions.columnDefs = $scope.columns;
为此:

 dataGridOptions.columnDefs = angular.copy($scope.columns);

我怀疑ng grid指令可能对columnDefs选项进行了一些操作,因为columnDefs直接引用了$scope.columns属性,所以在columnDefs选项中执行的任何操作都可能会影响$scope.columns。

为什么不想在控制器中定义数组?HTML从您编写的形式来看似乎有点混乱(也称为硬编码),我会尝试使用
将所有字符串包装在数组中。不仅是值,还有键,请不要走“为什么要这样做”的路线。你觉得这样很乱。我认为将与表示严格相关的配置变量扔到控制器中是很麻烦的。让我们不要讨论这个问题。不幸的是,使用'不起作用。我的示例不能按原样工作-它抛出了“与指令一起使用的错误:[$compile:nonassign]表达式是不可赋值的!”这当然是一种方式,但现在感觉有点太粗糙了。还有其他方法吗?还有一种方法是通过属性传递它。虽然它将被视为字符串,但您可以使用eval()将其转换为对象并将其分配给范围变量。我已经更新了我的plnkr-即使指令和dom之间有正常的作用域绑定,它也可以正常工作。我想你的数组语法是错误的。你能再次检查plnkr吗。我已经更新了。是的,这很有效。问题似乎有点更深。我的错误出现在中的另一个指令中,该指令使此参数通过。如果不粘贴大量代码,就很难解释,我仍然不知道它出了什么问题。嗯。。。你可能发现了什么。我已经用我的代码更新了我的问题。你能看一下吗?我不是在修改scope.columns,而是将其分配给另一个变量,然后将该变量分配给新的scope属性。这一周期看起来是有问题的。但是,我看得越多,就越确信使用=只是一个错误。我应该使用@,因为在指令的作用域变量和父级的作用域变量之间没有合适的绑定,因为我没有指定它的名称,而是直接放置数组。对吗?错误只是一个结果(对吗?)嗯,最好创建一个plunker,然后重新创建问题,让每个人都来评估问题。另一方面,使用
@
表示法只是将字符串传递给分配的范围变量。如果在scope属性属性上使用
scope.$eval()
,并在其中操作手头的数据,则可能会起作用。如果不限制通过指令控制器维护指令的状态,则只需访问
attr
参数中的字符串即可,例如
attr.columns
scope.$eval()
将其用于操作。这就是我到目前为止所做的,它工作正常。但我仍然想知道使用=时发生了什么,以及为什么它看起来如此不可预测。不幸的是,我不熟悉plunkr,但我已经写了原始问题中的所有部分。是的,就是这样!所以,让我直截了当地说吧——因为这是传递给ng grid的,当它操作整个dataGridOptions对象时,它会触发对$scope.columns的绑定更新(然后会失败,因为它们不能绑定到任何东西)。由于我们正在进行(深度?)复制,ng网格操作不会触发原始$scope.columns中的绑定更新?非常感谢您的帮助,非常感谢!
 dataGridOptions.columnDefs = $scope.columns;
 dataGridOptions.columnDefs = angular.copy($scope.columns);