Angularjs $parse()的第二个参数是什么?

Angularjs $parse()的第二个参数是什么?,angularjs,Angularjs,今天,我在查看源代码时遇到了这个问题: 但官方文件没有具体说明第二个论点 它做什么?来源 v1.3.4: function addInterceptor(parsedExpression, interceptorFn) { if (!interceptorFn) return parsedExpression; var watchDelegate = parsedExpression.$$watchDelegate; var regularWatch = watchDe

今天,我在查看源代码时遇到了这个问题:

但官方文件没有具体说明第二个论点


它做什么?

来源

v1.3.4:

function addInterceptor(parsedExpression, interceptorFn) {
  if (!interceptorFn) return parsedExpression;
  var watchDelegate = parsedExpression.$$watchDelegate;

  var regularWatch =
      watchDelegate !== oneTimeLiteralWatchDelegate &&
      watchDelegate !== oneTimeWatchDelegate;

  var fn = regularWatch ? function regularInterceptedExpression(scope, locals) {
    var value = parsedExpression(scope, locals);
    return interceptorFn(value, scope, locals);
  } : function oneTimeInterceptedExpression(scope, locals) {
    var value = parsedExpression(scope, locals);
    var result = interceptorFn(value, scope, locals);
    // we only return the interceptor's result if the
    // initial value is defined (for bind-once)
    return isDefined(value) ? result : value;
  };

  // Propagate $$watchDelegates other then inputsWatchDelegate
  if (parsedExpression.$$watchDelegate &&
      parsedExpression.$$watchDelegate !== inputsWatchDelegate) {
    fn.$$watchDelegate = parsedExpression.$$watchDelegate;
  } else if (!interceptorFn.$stateful) {
    // If there is an interceptor, but no watchDelegate then treat the interceptor like
    // we treat filters - it is assumed to be a pure function unless flagged with $stateful
    fn.$$watchDelegate = inputsWatchDelegate;
    fn.inputs = [parsedExpression];
  }

  return fn;
}
根据上面的示例和angularjs的来源,第二个参数允许您对解析结果应用类似于转换的逻辑

看看:

似乎,它是用来提供单一的方式为手表来源的ngOptions。它会在名称和/或标签更改时触发。如果它不被使用,手表将只适用于标签的变化或价值的变化,而不是两者

角度代码中使用的其他示例

一,。警钟

这里,我们基于转换为字符串的$parse值构造一个watch。似乎在$digest循环中进行更好、更简单的比较

二,。指令的'='作用域参数中的监视

正如您所看到的,我们只是基于脏检查保持范围值同步。这就是为什么我们需要第二个$digest周期来触发指令的内部监视


摘要

似乎这是一种从繁重的东西转变为简单的东西的方法,在$digest循环中,简单的
=
应该可以与之相比。我们需要得出结论,我们是否应该触发手表

它也可能被用作放置手表通用逻辑的一种方式。当我们需要$parsed value时,它允许一次写入它们,并用于所有情况。

如果您查看,它是一种拦截器函数,可以使用或操作解析的表达式值。在本例中,它获取值并将其转换为监视对象的集合。
function addInterceptor(parsedExpression, interceptorFn) {
  if (!interceptorFn) return parsedExpression;
  var watchDelegate = parsedExpression.$$watchDelegate;

  var regularWatch =
      watchDelegate !== oneTimeLiteralWatchDelegate &&
      watchDelegate !== oneTimeWatchDelegate;

  var fn = regularWatch ? function regularInterceptedExpression(scope, locals) {
    var value = parsedExpression(scope, locals);
    return interceptorFn(value, scope, locals);
  } : function oneTimeInterceptedExpression(scope, locals) {
    var value = parsedExpression(scope, locals);
    var result = interceptorFn(value, scope, locals);
    // we only return the interceptor's result if the
    // initial value is defined (for bind-once)
    return isDefined(value) ? result : value;
  };

  // Propagate $$watchDelegates other then inputsWatchDelegate
  if (parsedExpression.$$watchDelegate &&
      parsedExpression.$$watchDelegate !== inputsWatchDelegate) {
    fn.$$watchDelegate = parsedExpression.$$watchDelegate;
  } else if (!interceptorFn.$stateful) {
    // If there is an interceptor, but no watchDelegate then treat the interceptor like
    // we treat filters - it is assumed to be a pure function unless flagged with $stateful
    fn.$$watchDelegate = inputsWatchDelegate;
    fn.inputs = [parsedExpression];
  }

  return fn;
}
// We will re-render the option elements if the option values or labels change
scope.$watchCollection(ngOptions.getWatchables, updateOptions);
  var ngBindHtmlWatch = $parse(tAttrs.ngBindHtml, function getStringValue(value) {
    return (value || '').toString();
  });
var parentValueWatch = function parentValueWatch(parentValue) {
  if (!compare(parentValue, isolateBindingContext[scopeName])) {
  // we are out of sync and need to copy
  if (!compare(parentValue, lastValue)) {
  // parent changed and it has precedence
  isolateBindingContext[scopeName] = parentValue;
  } else {
  // if the parent can be assigned then do so
  parentSet(scope, parentValue = isolateBindingContext[scopeName]);
}
}
return lastValue = parentValue;
};