fix(change_detector): adding new ranges when disabling the current enabled record
This commit is contained in:
@ -40,7 +40,7 @@ export class ChangeDetector {
|
||||
}
|
||||
}
|
||||
|
||||
record = record.nextEnabled;
|
||||
record = record.findNextEnabled();
|
||||
}
|
||||
|
||||
return count;
|
||||
|
@ -173,6 +173,10 @@ export class Record {
|
||||
return (this._mode & RECORD_FLAG_DISABLED) === RECORD_FLAG_DISABLED;
|
||||
}
|
||||
|
||||
isEnabled():boolean {
|
||||
return ! this.disabled;
|
||||
}
|
||||
|
||||
set disabled(value:boolean) {
|
||||
if (value) {
|
||||
this._mode |= RECORD_FLAG_DISABLED;
|
||||
@ -316,6 +320,49 @@ export class Record {
|
||||
groupMemento() {
|
||||
return isPresent(this.protoRecord) ? this.protoRecord.groupMemento : null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the next enabled record. This search is not limited to the current range.
|
||||
*
|
||||
* [H ER1 T] [H ER2 T] _nextEnable(ER1) will return ER2
|
||||
*
|
||||
* The function skips disabled sub ranges.
|
||||
*/
|
||||
findNextEnabled() {
|
||||
if (this.isEnabled()) return this.nextEnabled;
|
||||
|
||||
var record = this.next;
|
||||
while (isPresent(record) && record.disabled) {
|
||||
if (record.isMarkerRecord && record.recordRange.disabled) {
|
||||
record = record.recordRange.tailRecord.next;
|
||||
} else {
|
||||
record = record.next;
|
||||
}
|
||||
}
|
||||
return record;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the prev enabled record. This search is not limited to the current range.
|
||||
*
|
||||
* [H ER1 T] [H ER2 T] _nextEnable(ER2) will return ER1
|
||||
*
|
||||
* The function skips disabled sub ranges.
|
||||
*/
|
||||
findPrevEnabled() {
|
||||
if (this.isEnabled()) return this.prevEnabled;
|
||||
|
||||
var record = this.prev;
|
||||
while (isPresent(record) && record.disabled) {
|
||||
if (record.isMarkerRecord && record.recordRange.disabled) {
|
||||
record = record.recordRange.headRecord.prev;
|
||||
} else {
|
||||
record = record.prev;
|
||||
}
|
||||
}
|
||||
return record;
|
||||
}
|
||||
}
|
||||
|
||||
function isSame(a, b) {
|
||||
|
@ -129,8 +129,8 @@ export class RecordRange {
|
||||
|
||||
addRange(child:RecordRange) {
|
||||
var lastRecord = this.tailRecord.prev;
|
||||
var prevEnabledRecord = RecordRange._prevEnabled(this.tailRecord);
|
||||
var nextEnabledRerord = RecordRange._nextEnabled(this.tailRecord);
|
||||
var prevEnabledRecord = this.tailRecord.findPrevEnabled();
|
||||
var nextEnabledRerord = this.tailRecord.findNextEnabled();
|
||||
|
||||
var firstEnabledChildRecord = child.findFirstEnabledRecord();
|
||||
var lastEnabledChildRecord = child.findLastEnabledRecord();
|
||||
@ -174,10 +174,10 @@ export class RecordRange {
|
||||
}
|
||||
|
||||
enableRecord(record:Record) {
|
||||
if (!record.disabled) return;
|
||||
if (record.isEnabled()) return;
|
||||
|
||||
var prevEnabled = RecordRange._prevEnabled(record);
|
||||
var nextEnabled = RecordRange._nextEnabled(record);
|
||||
var prevEnabled = record.findPrevEnabled();
|
||||
var nextEnabled = record.findNextEnabled();
|
||||
|
||||
record.prevEnabled = prevEnabled;
|
||||
record.nextEnabled = nextEnabled;
|
||||
@ -203,8 +203,8 @@ export class RecordRange {
|
||||
}
|
||||
|
||||
enable() {
|
||||
var prevEnabledRecord = RecordRange._prevEnabled(this.headRecord);
|
||||
var nextEnabledRecord = RecordRange._nextEnabled(this.tailRecord);
|
||||
var prevEnabledRecord = this.headRecord.findPrevEnabled();
|
||||
var nextEnabledRecord = this.tailRecord.findNextEnabled();
|
||||
|
||||
var firstEnabledthisRecord = this.findFirstEnabledRecord();
|
||||
var lastEnabledthisRecord = this.findLastEnabledRecord();
|
||||
@ -268,44 +268,6 @@ export class RecordRange {
|
||||
return record === this.headRecord ? null : record;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the next enabled record. This search is not limited to the current range.
|
||||
*
|
||||
* [H ER1 T] [H ER2 T] _nextEnable(ER1) will return ER2
|
||||
*
|
||||
* The function skips disabled sub ranges.
|
||||
*/
|
||||
static _nextEnabled(record:Record) {
|
||||
record = record.next;
|
||||
while (isPresent(record) && record.disabled) {
|
||||
if (record.isMarkerRecord && record.recordRange.disabled) {
|
||||
record = record.recordRange.tailRecord.next;
|
||||
} else {
|
||||
record = record.next;
|
||||
}
|
||||
}
|
||||
return record;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the prev enabled record. This search is not limited to the current range.
|
||||
*
|
||||
* [H ER1 T] [H ER2 T] _nextEnable(ER2) will return ER1
|
||||
*
|
||||
* The function skips disabled sub ranges.
|
||||
*/
|
||||
static _prevEnabled(record:Record) {
|
||||
record = record.prev;
|
||||
while (isPresent(record) && record.disabled) {
|
||||
if (record.isMarkerRecord && record.recordRange.disabled) {
|
||||
record = record.recordRange.headRecord.prev;
|
||||
} else {
|
||||
record = record.prev;
|
||||
}
|
||||
}
|
||||
return record;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the context (the object) on which the change detection expressions will
|
||||
* dereference themselves on. Since the RecordRange can be reused the context
|
||||
|
Reference in New Issue
Block a user