refactor(change_detect): Move (de)hydrate logic into dedicated methods

Call new `(de)hydrateDirectives` methods from `(de)hydrate`. Add a null
implementation in `AbstractChangeDetector` and only override if
necessary for the specific change detector.

Update to #3248
This commit is contained in:
Tim Blasi
2015-07-27 18:31:22 -07:00
parent a9efc48e71
commit d84993faf1
4 changed files with 98 additions and 35 deletions

View File

@ -115,7 +115,7 @@ class _CodegenState {
this.$_PROTOS_ACCESSOR,
this.$_DIRECTIVES_ACCESSOR)
: super(${_encodeValue(_changeDetectorDefId)}, $_DISPATCHER_ACCESSOR) {
${_names.genDehydrateFields()}
dehydrateDirectives(false);
}
void detectChangesInRecords(throwOnChange) {
@ -123,9 +123,9 @@ class _CodegenState {
$_UTIL.throwDehydrated();
}
try {
this.__detectChangesInRecords(throwOnChange);
__detectChangesInRecords(throwOnChange);
} catch (e, s) {
this.throwError($_CURRENT_PROTO, e, s);
throwError($_CURRENT_PROTO, e, s);
}
}
@ -151,19 +151,21 @@ class _CodegenState {
$_MODE_ACCESSOR = '$_changeDetectionMode';
${_names.getContextName()} = context;
$_LOCALS_ACCESSOR = locals;
${_genHydrateDirectives()}
${_genHydrateDetectors()}
hydrateDirectives(directives);
$_ALREADY_CHECKED_ACCESSOR = false;
$_PIPES_ACCESSOR = pipes;
}
${_maybeGenHydrateDirectives()}
void dehydrate() {
${_names.genPipeOnDestroy()}
${_names.genDehydrateFields()}
dehydrateDirectives(true);
$_LOCALS_ACCESSOR = null;
$_PIPES_ACCESSOR = null;
}
${_maybeGenDehydrateDirectives()}
hydrated() => ${_names.getContextName()} != null;
static $_GEN_PREFIX.ProtoChangeDetector
@ -184,6 +186,34 @@ class _CodegenState {
''');
}
String _maybeGenDehydrateDirectives() {
var destroyPipesParamName = 'destroyPipes';
var destroyPipesCode = _names.genPipeOnDestroy();
if (destroyPipesCode.isNotEmpty) {
destroyPipesCode = 'if (${destroyPipesParamName}) { '
'${destroyPipesCode}'
'}';
}
var dehydrateFieldsCode = _names.genDehydrateFields();
if (destroyPipesCode.isEmpty && dehydrateFieldsCode.isEmpty) return '';
return 'void dehydrateDirectives(${destroyPipesParamName}) {'
'${destroyPipesCode}'
'${dehydrateFieldsCode}'
'}';
}
String _maybeGenHydrateDirectives() {
var hydrateDirectivesCode = _genHydrateDirectives();
var hydrateDetectorsCode = _genHydrateDetectors();
if (hydrateDirectivesCode.isEmpty && hydrateDetectorsCode.isEmpty) {
return '';
}
return 'void hydrateDirectives(directives) { '
'$hydrateDirectivesCode'
'$hydrateDetectorsCode'
'}';
}
String _genHydrateDirectives() {
var buf = new StringBuffer();
var directiveFieldNames = _names.getAllDirectiveNames();
@ -412,7 +442,7 @@ class _CodegenState {
String _genCheckNoChanges() {
if (this._generateCheckNoChanges) {
return 'void checkNoChanges() { this.runDetectChanges(true); }';
return 'void checkNoChanges() { runDetectChanges(true); }';
} else {
return '';
}