У меня есть приложение AngularDart, которое показывает окно множественного выбора, подобное этому:
Я выбираю одну или несколько записей слева, нажимаю > и она идет вправо. Отлично работает в Dartium, но в Javascript браузер входит в бесконечный цикл, который зависает на вкладке или даже в браузере (то же самое в Chrome, Firefox и IE). Я использую shadow_dom, чтобы заставить его работать в других браузерах, и это работало только в Chrome с Dart 1.0.
Инструменты разработчика выглядят следующим образом:
Я действительно не вижу какого-либо конкретного кода, выполняемого на стороне Dart, обработчики событий, видимые выше, содержат очень мало значимого для меня кода. Когда я приостанавливаю бесконечный цикл Javascript, он приводит меня в это место:
AbstractNgRepeatDirective._onCollectionChange$1 (myappui.dart.js:14365)
(anonymous function) (VM5977:3)
relaxFnApply (myappui.dart.js:15739)
Scope_$watchCollection_closure4.call$3 (myappui.dart.js:7031)
_Watch.fn$3 (myappui.dart.js:7124)
Scope._digestHandleDirty$5 (myappui.dart.js:6535)
Scope._digestComputeLastDirty$0 (myappui.dart.js:6497)
Scope._digestWhileDirtyLoop$0 (myappui.dart.js:6433)
Scope.$$digest$0 (myappui.dart.js:6419)
Scope._autoDigestOnTurnDone$0 (myappui.dart.js:6269)
(anonymous function) (VM5930:3)
_rootRun (myappui.dart.js:20398)
_ZoneDelegate.run$2 (myappui.dart.js:26185)
NgZone._finishTurn$2 (myappui.dart.js:7267)
NgZone._onRunBase$4 (myappui.dart.js:7239)
NgZone._onRunUnary$5 (myappui.dart.js:7246)
(anonymous function) (VM5919:3)
_ZoneDelegate.runUnary$3 (myappui.dart.js:26192)
_CustomizedZone.runUnary$2 (myappui.dart.js:26419)
_BaseZone.runUnaryGuarded$2 (myappui.dart.js:26285)
_BaseZone_bindUnaryCallback_closure.call$1 (myappui.dart.js:26357)
invokeClosure_closure0.call$0 (myappui.dart.js:4573)
_IsolateContext.eval$1 (myappui.dart.js:2006)
_callInIsolate (myappui.dart.js:1740)
invokeClosure (myappui.dart.js:3224)
(anonymous function) (myappui.dart.js:3241)
invoke (shadow_dom.debug.js:2587)
dispatchBubbling (shadow_dom.debug.js:2535)
dispatchEvent (shadow_dom.debug.js:2489)
dispatchOriginalEvent (shadow_dom.debug.js:2467)
И код цикла:
_onCollectionChange$1: [function(collection) {
var previousNode, cursor, arrayChange, t1, newRowOrder, $length, nextNode, index, value, row, childScope, t2, t3, block;
previousNode = J.$index$asx(J.get$elements$x(this._blockHole), 0);
cursor = this._blockHole;
arrayChange = !J.$eq(this._lastCollection, collection);
if (arrayChange)
this._lastCollection = collection;
t1 = J.getInterceptor(collection);
if (typeof collection !== "object" || collection === null || collection.constructor !== Array && !t1.$isIterable)
collection = [];
newRowOrder = this._computeNewRows$2(collection, null);
t1 = J.getInterceptor$asx(collection);
$length = t1.get$length(collection);
if (typeof $length !== "number")
return H.iae($length);
nextNode = null;
index = 0;
for (; index < $length; ++index) {
value = t1.elementAt$1(collection, index);
if (index >= newRowOrder.length)
return H.ioore(newRowOrder, index);
row = newRowOrder[index];
if (row.get$startNode() != null) {
childScope = row.get$scope();
nextNode = previousNode;
do
nextNode = J.get$nextNode$x(nextNode);
while (nextNode != null);
if (J.$eq(row.get$startNode(), nextNode))
;
else
row.get$block().moveAfter$1(cursor);
previousNode = row.get$endNode();
} else
childScope = this._directive$_scope.$$new$1$lazy(this.get$_shalow());
t2 = J.getInterceptor$asx(childScope);
while (nextNode!=null) никогда не становится нулевым...
do
nextNode = J.get$nextNode$x(nextNode);
while (nextNode != null);
Поскольку я относительно новичок в Dart, я должен сказать, что не очень понимаю, где искать. Любое предложение ?
Соответствующий pubspec.yaml:
dependencies:
angular: 0.9.4
browser: any
myapp:
path: ../myappLib
intl: any
json_object: any
petitparser: any
shadow_dom: any
ОБНОВЛЕНИЕ Виновником, очевидно, является shadow_dom. Когда я удаляю тег, он работает в Chrome (очевидно, больше не в Firefox и IE).