我有一个小查询来理解一段代码。
根据以下语法作为参数传递时,我认为 $ 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?
答案 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();
});