当作为数组传递时,$ watchCollection参数返回错误

Nev*_*r K 5 d3.js angularjs angularjs-directive

我有一个小查询了解一段代码.

我认为$ watchCollection将根据以下语法作为参数传递时监视数组:

$ watchCollection(obj,listener);

我的查询是在这段代码中:

  var exp = $parse(attrs.chartData);
  var salesDataToPlot=exp(scope);
Run Code Online (Sandbox Code Playgroud)

然后用于:

scope.$watchCollection(exp, function(newVal, oldVal){
               salesDataToPlot=newVal;
               redrawLineChart();
           });
Run Code Online (Sandbox Code Playgroud)

"exp"是类型函数,当我试图将它作为数组传递时,我得到了"无法读取未定义的属性'长度"错误.我在尝试此代码时遇到了错误:

  var salesData = scope[iAttrs.chartData];

.
.
.
.

  scope.$watchCollection(salesData, function(newVal, oldVal){
                   salesDataToPlot=newVal;
                   redrawLineChart();
               });
Run Code Online (Sandbox Code Playgroud)

为什么我不能将salesData作为数组传递给$ watchCollection?

这是我的笔

Ori*_*ori 2

$parse服务接受一个表达式,并将其转换为一个函数,当给定上下文(通常是范围)时,该函数将解析为实际数据。

  var exp = $parse(attrs.chartData); // exp is an expression function that needs context
  var salesDataToPlot=exp(scope); is the actual result of supplying exp with context - the scope. The result is the array you need
Run Code Online (Sandbox Code Playgroud)

只需观看 salesDataToPlot ( pen ):

scope.salesDataToPlot = salesDataToPlot;

scope.$watchCollection('salesDataToPlot', function(newVal, oldVal){
               salesDataToPlot=newVal;
               redrawLineChart();
           });
Run Code Online (Sandbox Code Playgroud)

直接使用 salesData 会引发错误,因为 salesData 是作用域上的属性,而不是此闭包中可用的变量。要使 $watchCollection 在范围内查找此属性,您必须使用“salesData”( pen )。

  scope.$watchCollection("salesData", function(newVal, oldVal){
                   salesDataToPlot=newVal;
                   redrawLineChart();
               });
Run Code Online (Sandbox Code Playgroud)