Наличие двух директив ng-model вызывает: Достигнуто 5 итераций $digest(). Прерывание

Вот действительно урезанная версия того, что, кажется, заставляет Angular-Dart прервать бесконечный цикл. Я просмотрел каждый из других связанных вопросов в stackoverflow, но не смог добиться никакого прогресса. Это кажется особенно тривиальной реализацией, которая должна работать... что я не понимаю?

У меня есть два компонента (comp_a и comp_b):

A:

library comp_a;

import 'package:angular/angular.dart';

@NgComponent(
    selector: 'comp-a',
    template: '<div id="compa"></div>',
    publishAs: 'cmp'
)
class CompA {
  NgModel _ngModel;

  CompA(this._ngModel);
}

B:

library comp_b;

import 'package:angular/angular.dart';

@NgComponent(
    selector: 'comp-b',
    template: '<div id="compb"></div>',
    publishAs: 'cmp'
)
class CompB {
  NgModel _ngModel;

  CompB(this._ngModel);
}

Мой файл с дротиками main() такой же скучный:

library main;

import 'package:angular/angular.dart';
import 'package:loop/component/comp_a.dart';
import 'package:loop/component/comp_b.dart';

class CompModule extends Module {

  CompModule() {
    type(CompA);
    type(CompB);
  }
}

void main() {
  ngBootstrap(module: new CompModule());
}

Как и мой html-файл:

<!DOCTYPE html>

<html ng-app>
  <body>

      <comp-a ng-model="[1]"></comp-a>
      <comp-b ng-model="[2]"></comp-b>

    <script type="application/dart" src="loop.dart"></script>
    <script src="packages/browser/dart.js"></script>
  </body>
</html>

Если у меня есть и <comp-a>..., и <comp-b>... без ng-model, все работает отлично (т.е. в консоли нет ошибок). Если у меня есть <comp-a>... или <comp-b>... с ng-model, все работает нормально... только когда у них обоих есть ng-model, я получаю следующее:

5 $digest() iterations reached. Aborting!
Watchers fired in the last 3 iterations: [["ng-model=[1]","ng-model=[2]"],["ng-model=[1]","ng-model=[2]"],["ng-model=[1]","ng-model=[2]"]]

STACKTRACE:
#0      Scope._digestWhileDirtyLoop (package:angular/core/scope.dart:526:5)
#1      Scope.$digest (package:angular/core/scope.dart:475:28)
#2      _autoDigestOnTurnDone (package:angular/core/scope.dart:153:14)
#3      _rootRun (dart:async/zone.dart:688)
#4      _ZoneDelegate.run (dart:async/zone.dart:417)
#5      NgZone._finishTurn (package:angular/core/zone.dart:91:21)
#6      NgZone._onRunBase (package:angular/core/zone.dart:56:43)
#7      _onRun (package:angular/core/zone.dart:61:15)
#8      _ZoneDelegate.run (dart:async/zone.dart:417)
#9      _CustomizedZone.run (dart:async/zone.dart:627)
#10     NgZone.run (package:angular/core/zone.dart:143:27)
#11     ngBootstrap (package:angular/bootstrap.dart:87:18)
#12     main (http://127.0.0.1:3030/loop/web/loop.dart:16:14)

Спасибо!


person jpoveda    schedule 13.02.2014    source источник


Ответы (2)


Дикая догадка

[1] [2] сопоставляются с одним и тем же атрибутом Scope (может быть ошибкой) и неоднократно обновляют значения друг друга. (1, 2, 1, 2, 1, 2, ...)

Я бы попытался заключить каждый элемент в тег div и добавить к ним какой-нибудь фиктивный контроллер, чтобы изолировать области видимости.

Здесь у меня нет глубоких знаний. Вероятно, есть гораздо лучшие решения.

person Günter Zöchbauer    schedule 13.02.2014

Мишко Хевери ответил на вопрос здесь: https://groups.google.com/d/msg/angular-dart/MYhHBphdY8Q/0ZU8nXQu9ZEJ

Ваше понимание масштаба правильное. Но из-за того, как работают наблюдатели (скоро это будет исправлено), система создает новый массив для каждого дайджеста. Вот почему он никогда не стабилизируется. вы должны привязать к полю. ng-model="someCtroller.someField" вместо ng-mode="[1]". -- миско

Я завернул два своих компонента в div с директивой контроллера и изменил ng-модели из статических массивов, чтобы привязать их к соответствующим полям контроллера, и все заработало нормально.

E.g.,

@NgController(
  selector: '[test-controller]',
  publishAs: 'ctrl'
)
class TestController {

  List a;
  List b;

}

А также,

<div test-controller>
    <comp-a ng-model="ctrl.a"></comp-a>
    <comp-b ng-model="ctrl.b"></comp-b>
</div>

Это решило проблему. Статические массивы были предназначены только для тестирования, поэтому я ничего не потерял, введя контроллер.

person jpoveda    schedule 13.02.2014