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

时间:2015-08-13 04:30:15

标签: angularjs d3.js angularjs-directive

我有一个小查询来理解一段代码。

根据以下语法作为参数传递时,我认为 $ watchCollection会观看数组

  

$ watchCollection(obj,listener);

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

  var exp = $parse(attrs.chartData);
  var salesDataToPlot=exp(scope);

然后用于:

scope.$watchCollection(exp, function(newVal, oldVal){
               salesDataToPlot=newVal;
               redrawLineChart();
           });

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

  var salesData = scope[iAttrs.chartData];

.
.
.
.

  scope.$watchCollection(salesData, function(newVal, oldVal){
                   salesDataToPlot=newVal;
                   redrawLineChart();
               });

为什么coudn将salesData作为数组传递给$ watchCollection?

Here's my pen

1 个答案:

答案 0 :(得分: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

只需观看salesDataToPlot(pen):

scope.salesDataToPlot = salesDataToPlot;

scope.$watchCollection('salesDataToPlot', function(newVal, oldVal){
               salesDataToPlot=newVal;
               redrawLineChart();
           });

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

  scope.$watchCollection("salesData", function(newVal, oldVal){
                   salesDataToPlot=newVal;
                   redrawLineChart();
               });