Операции множественного выбора AngularDart попадают в бесконечный цикл в режиме JS

У меня есть приложение AngularDart, которое показывает окно множественного выбора, подобное этому: dart множественный выбор

Я выбираю одну или несколько записей слева, нажимаю > и она идет вправо. Отлично работает в 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).


person Eric Darchis    schedule 06.02.2014    source источник


Ответы (1)


Проблема исчезла в более поздних версиях shadow_dom (0.9.*)

person Eric Darchis    schedule 27.02.2014