parent
758062807a
commit
1316c3e391
|
@ -284,7 +284,7 @@ export class ChangeDetectorJITGenerator {
|
||||||
var condition = `!${pipe}.pure || (${contexOrArgCheck.join(" || ")})`;
|
var condition = `!${pipe}.pure || (${contexOrArgCheck.join(" || ")})`;
|
||||||
|
|
||||||
var check = `
|
var check = `
|
||||||
if (${oldValue} !== ${newValue}) {
|
if (${this.changeDetectionUtilVarName}.looseNotIdentical(${oldValue}, ${newValue})) {
|
||||||
${newValue} = ${this.changeDetectionUtilVarName}.unwrapValue(${newValue})
|
${newValue} = ${this.changeDetectionUtilVarName}.unwrapValue(${newValue})
|
||||||
${this._genChangeMarker(r)}
|
${this._genChangeMarker(r)}
|
||||||
${this._genUpdateDirectiveOrElement(r)}
|
${this._genUpdateDirectiveOrElement(r)}
|
||||||
|
@ -311,7 +311,7 @@ export class ChangeDetectorJITGenerator {
|
||||||
`;
|
`;
|
||||||
|
|
||||||
var check = `
|
var check = `
|
||||||
if (${newValue} !== ${oldValue}) {
|
if (${this.changeDetectionUtilVarName}.looseNotIdentical(${oldValue}, ${newValue})) {
|
||||||
${this._genChangeMarker(r)}
|
${this._genChangeMarker(r)}
|
||||||
${this._genUpdateDirectiveOrElement(r)}
|
${this._genUpdateDirectiveOrElement(r)}
|
||||||
${this._genAddToChanges(r)}
|
${this._genAddToChanges(r)}
|
||||||
|
|
|
@ -1,4 +1,11 @@
|
||||||
import {CONST_EXPR, isPresent, isBlank, Type, StringWrapper} from 'angular2/src/core/facade/lang';
|
import {
|
||||||
|
CONST_EXPR,
|
||||||
|
isPresent,
|
||||||
|
isBlank,
|
||||||
|
Type,
|
||||||
|
StringWrapper,
|
||||||
|
looseIdentical
|
||||||
|
} from 'angular2/src/core/facade/lang';
|
||||||
import {BaseException} from 'angular2/src/core/facade/exceptions';
|
import {BaseException} from 'angular2/src/core/facade/exceptions';
|
||||||
import {ListWrapper, MapWrapper, StringMapWrapper} from 'angular2/src/core/facade/collection';
|
import {ListWrapper, MapWrapper, StringMapWrapper} from 'angular2/src/core/facade/collection';
|
||||||
import {ProtoRecord} from './proto_record';
|
import {ProtoRecord} from './proto_record';
|
||||||
|
@ -202,4 +209,6 @@ export class ChangeDetectionUtil {
|
||||||
static directiveIndex(elementIndex: number, directiveIndex: number): DirectiveIndex {
|
static directiveIndex(elementIndex: number, directiveIndex: number): DirectiveIndex {
|
||||||
return new DirectiveIndex(elementIndex, directiveIndex);
|
return new DirectiveIndex(elementIndex, directiveIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static looseNotIdentical(a: any, b: any): boolean { return !looseIdentical(a, b); }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import {isPresent, isBlank, looseIdentical} from 'angular2/src/core/facade/lang';
|
import {isPresent, isBlank, looseIdentical, StringWrapper} from 'angular2/src/core/facade/lang';
|
||||||
import {ListWrapper, Map} from 'angular2/src/core/facade/collection';
|
import {ListWrapper, Map} from 'angular2/src/core/facade/collection';
|
||||||
import {RecordType, ProtoRecord} from './proto_record';
|
import {RecordType, ProtoRecord} from './proto_record';
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ function _findMatching(r: ProtoRecord, rs: ProtoRecord[]) {
|
||||||
return ListWrapper.find(
|
return ListWrapper.find(
|
||||||
rs, (rr) => rr.mode !== RecordType.DirectiveLifecycle && _sameDirIndex(rr, r) &&
|
rs, (rr) => rr.mode !== RecordType.DirectiveLifecycle && _sameDirIndex(rr, r) &&
|
||||||
rr.mode === r.mode && looseIdentical(rr.funcOrValue, r.funcOrValue) &&
|
rr.mode === r.mode && looseIdentical(rr.funcOrValue, r.funcOrValue) &&
|
||||||
rr.contextIndex === r.contextIndex && looseIdentical(rr.name, r.name) &&
|
rr.contextIndex === r.contextIndex && StringWrapper.equals(rr.name, r.name) &&
|
||||||
ListWrapper.equals(rr.args, r.args));
|
ListWrapper.equals(rr.args, r.args));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -245,7 +245,7 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
|
||||||
|
|
||||||
if (proto.shouldBeChecked()) {
|
if (proto.shouldBeChecked()) {
|
||||||
var prevValue = this._readSelf(proto, values);
|
var prevValue = this._readSelf(proto, values);
|
||||||
if (!isSame(prevValue, currValue)) {
|
if (ChangeDetectionUtil.looseNotIdentical(prevValue, currValue)) {
|
||||||
if (proto.lastInBinding) {
|
if (proto.lastInBinding) {
|
||||||
var change = ChangeDetectionUtil.simpleChange(prevValue, currValue);
|
var change = ChangeDetectionUtil.simpleChange(prevValue, currValue);
|
||||||
if (throwOnChange) this.throwOnChangeError(prevValue, currValue);
|
if (throwOnChange) this.throwOnChangeError(prevValue, currValue);
|
||||||
|
@ -348,7 +348,7 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
|
||||||
|
|
||||||
if (proto.shouldBeChecked()) {
|
if (proto.shouldBeChecked()) {
|
||||||
var prevValue = this._readSelf(proto, values);
|
var prevValue = this._readSelf(proto, values);
|
||||||
if (!isSame(prevValue, currValue)) {
|
if (ChangeDetectionUtil.looseNotIdentical(prevValue, currValue)) {
|
||||||
currValue = ChangeDetectionUtil.unwrapValue(currValue);
|
currValue = ChangeDetectionUtil.unwrapValue(currValue);
|
||||||
|
|
||||||
if (proto.lastInBinding) {
|
if (proto.lastInBinding) {
|
||||||
|
@ -443,10 +443,3 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isSame(a, b): boolean {
|
|
||||||
if (a === b) return true;
|
|
||||||
if (a instanceof String && b instanceof String && a == b) return true;
|
|
||||||
if ((a !== a) && (b !== b)) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
|
@ -49,8 +49,3 @@ class PregenProtoChangeDetector extends ProtoChangeDetector {
|
||||||
@override
|
@override
|
||||||
instantiate(dynamic dispatcher) => _instantiateMethod(dispatcher);
|
instantiate(dynamic dispatcher) => _instantiateMethod(dispatcher);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Provided as an optimization to cut down on '!' characters in generated
|
|
||||||
/// change detectors. See https://github.com/angular/angular/issues/3248 for
|
|
||||||
/// for details.
|
|
||||||
bool looseNotIdentical(a, b) => !looseIdentical(a, b);
|
|
||||||
|
|
|
@ -418,7 +418,8 @@ var _availableDefinitions = [
|
||||||
'a()(99)',
|
'a()(99)',
|
||||||
'a.sayHi("Jim")',
|
'a.sayHi("Jim")',
|
||||||
'passThrough([12])',
|
'passThrough([12])',
|
||||||
'invalidFn(1)'
|
'invalidFn(1)',
|
||||||
|
'age'
|
||||||
];
|
];
|
||||||
|
|
||||||
var _availableEventDefinitions = [
|
var _availableEventDefinitions = [
|
||||||
|
|
|
@ -17,8 +17,10 @@ import {
|
||||||
CONST_EXPR,
|
CONST_EXPR,
|
||||||
isPresent,
|
isPresent,
|
||||||
isBlank,
|
isBlank,
|
||||||
|
isNumber,
|
||||||
isJsObject,
|
isJsObject,
|
||||||
FunctionWrapper,
|
FunctionWrapper,
|
||||||
|
NumberWrapper,
|
||||||
normalizeBool
|
normalizeBool
|
||||||
} from 'angular2/src/core/facade/lang';
|
} from 'angular2/src/core/facade/lang';
|
||||||
import {BaseException, WrappedException} from 'angular2/src/core/facade/exceptions';
|
import {BaseException, WrappedException} from 'angular2/src/core/facade/exceptions';
|
||||||
|
@ -258,6 +260,19 @@ export function main() {
|
||||||
expect(_bindSimpleValue('a.sayHi("Jim")', td)).toEqual(['propName=Hi, Jim']);
|
expect(_bindSimpleValue('a.sayHi("Jim")', td)).toEqual(['propName=Hi, Jim']);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should support NaN', () => {
|
||||||
|
var person = new Person('misko');
|
||||||
|
person.age = NumberWrapper.NaN;
|
||||||
|
var val = _createChangeDetector('age', person);
|
||||||
|
|
||||||
|
val.changeDetector.detectChanges();
|
||||||
|
expect(val.dispatcher.log).toEqual(['propName=NaN']);
|
||||||
|
val.dispatcher.clear();
|
||||||
|
|
||||||
|
val.changeDetector.detectChanges();
|
||||||
|
expect(val.dispatcher.log).toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
it('should do simple watching', () => {
|
it('should do simple watching', () => {
|
||||||
var person = new Person('misko');
|
var person = new Person('misko');
|
||||||
var val = _createChangeDetector('name', person);
|
var val = _createChangeDetector('name', person);
|
||||||
|
@ -1420,7 +1435,13 @@ class TestDispatcher implements ChangeDispatcher {
|
||||||
|
|
||||||
getDebugContext(a, b) { return null; }
|
getDebugContext(a, b) { return null; }
|
||||||
|
|
||||||
_asString(value) { return (isBlank(value) ? 'null' : value.toString()); }
|
_asString(value) {
|
||||||
|
if (isNumber(value) && NumberWrapper.isNaN(value)) {
|
||||||
|
return 'NaN';
|
||||||
|
}
|
||||||
|
|
||||||
|
return isBlank(value) ? 'null' : value.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _ChangeDetectorAndDispatcher {
|
class _ChangeDetectorAndDispatcher {
|
||||||
|
|
|
@ -354,7 +354,7 @@ class _CodegenState {
|
||||||
var pipeType = r.name;
|
var pipeType = r.name;
|
||||||
|
|
||||||
var init = '''
|
var init = '''
|
||||||
if (${_genPrefix}$_IDENTICAL_CHECK_FN($pipe, ${_genPrefix}$_UTIL.uninitialized)) {
|
if ($pipe == ${_genPrefix}$_UTIL.uninitialized) {
|
||||||
$pipe = ${_names.getPipesAccessorName()}.get('$pipeType');
|
$pipe = ${_names.getPipesAccessorName()}.get('$pipeType');
|
||||||
}
|
}
|
||||||
''';
|
''';
|
||||||
|
@ -368,7 +368,7 @@ class _CodegenState {
|
||||||
var condition = '''!${pipe}.pure || (${contexOrArgCheck.join(" || ")})''';
|
var condition = '''!${pipe}.pure || (${contexOrArgCheck.join(" || ")})''';
|
||||||
|
|
||||||
var check = '''
|
var check = '''
|
||||||
if (${_genPrefix}$_NOT_IDENTICAL_CHECK_FN($oldValue, $newValue)) {
|
if (${_genPrefix}$_UTIL.looseNotIdentical($oldValue, $newValue)) {
|
||||||
$newValue = ${_genPrefix}$_UTIL.unwrapValue($newValue);
|
$newValue = ${_genPrefix}$_UTIL.unwrapValue($newValue);
|
||||||
${_genChangeMarker(r)}
|
${_genChangeMarker(r)}
|
||||||
${_genUpdateDirectiveOrElement(r)}
|
${_genUpdateDirectiveOrElement(r)}
|
||||||
|
@ -394,7 +394,7 @@ class _CodegenState {
|
||||||
''';
|
''';
|
||||||
|
|
||||||
var check = '''
|
var check = '''
|
||||||
if (${_genPrefix}$_NOT_IDENTICAL_CHECK_FN($newValue, $oldValue)) {
|
if (${_genPrefix}$_UTIL.looseNotIdentical($newValue, $oldValue)) {
|
||||||
${_genChangeMarker(r)}
|
${_genChangeMarker(r)}
|
||||||
${_genUpdateDirectiveOrElement(r)}
|
${_genUpdateDirectiveOrElement(r)}
|
||||||
${_genAddToChanges(r)}
|
${_genAddToChanges(r)}
|
||||||
|
@ -532,8 +532,6 @@ const _CHANGES_LOCAL = 'changes';
|
||||||
const _GEN_PREFIX = '_gen';
|
const _GEN_PREFIX = '_gen';
|
||||||
const _GEN_PREFIX_WITH_DOT = _GEN_PREFIX + '.';
|
const _GEN_PREFIX_WITH_DOT = _GEN_PREFIX + '.';
|
||||||
const _GEN_RECORDS_METHOD_NAME = '_createRecords';
|
const _GEN_RECORDS_METHOD_NAME = '_createRecords';
|
||||||
const _IDENTICAL_CHECK_FN = 'looseIdentical';
|
|
||||||
const _NOT_IDENTICAL_CHECK_FN = 'looseNotIdentical';
|
|
||||||
const _IS_CHANGED_LOCAL = 'isChanged';
|
const _IS_CHANGED_LOCAL = 'isChanged';
|
||||||
const _PREGEN_PROTO_CHANGE_DETECTOR_IMPORT =
|
const _PREGEN_PROTO_CHANGE_DETECTOR_IMPORT =
|
||||||
'package:angular2/src/core/change_detection/pregen_proto_change_detector.dart';
|
'package:angular2/src/core/change_detection/pregen_proto_change_detector.dart';
|
||||||
|
|
Loading…
Reference in New Issue