2014-02-13 3 views
1

Вот действительно урезанная версия того, что, кажется, заставляет 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) 

Спасибо!

ответ

0

Miško Hevery ответил на вопрос здесь: https://groups.google.com/d/msg/angular-dart/MYhHBphdY8Q/0ZU8nXQu9ZEJ

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

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

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> 

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

0

Грубое предположение

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

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

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

Смежные вопросы