10

私はこのフィドル=でディレクティブとバインディングをいじっています。次のエラーが表示されます。

Uncaught Error: 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [["fn: function () {\n                  var parentValue = parentGet(parentScope);\n\n                  if (parentValue !== scope[scopeName]) {\n                    // we are out of sync and need to copy\n                    if (parentValue !== lastValue) {\n                      // parent changed and it has precedence\n                      lastValue = scope[scopeName] = parentValue;\n                    } else {\n                      // if the parent can be assigned then do so\n                      parentSet(parentScope, lastValue = scope[scopeName]);\n                    }\n                  }\n                  return parentValue;\n                }; newVal: {\"baz\":3}; oldVal: {\"baz\":3}"],["fn: function () {\n                  var parentValue = parentGet(parentScope);\n\n                  if (parentValue !== scope[scopeName]) {\n                    // we are out of sync and need to copy\n                    if (parentValue !== lastValue) {\n                      // parent changed and it has precedence\n                      lastValue = scope[scopeName] = parentValue;\n                    } else {\n                      // if the parent can be assigned then do so\n                      parentSet(parentScope, lastValue = scope[scopeName]);\n                    }\n                  }\n                  return parentValue;\n                }; newVal: {\"baz\":3}; oldVal: {\"baz\":3}"],["fn: function () {\n                  var parentValue = parentGet(parentScope);\n\n                  if (parentValue !== scope[scopeName]) {\n                    // we are out of sync and need to copy\n                    if (parentValue !== lastValue) {\n                      // parent changed and it has precedence\n                      lastValue = scope[scopeName] = parentValue;\n                    } else {\n                      // if the parent can be assigned then do so\n                      parentSet(parentScope, lastValue = scope[scopeName]);\n                    }\n                  }\n                  return parentValue;\n                }; newVal: {\"baz\":3}; oldVal: {\"baz\":3}"],["fn: function () {\n                  var parentValue = parentGet(parentScope);\n\n                  if (parentValue !== scope[scopeName]) {\n                    // we are out of sync and need to copy\n                    if (parentValue !== lastValue) {\n                      // parent changed and it has precedence\n                      lastValue = scope[scopeName] = parentValue;\n                    } else {\n                      // if the parent can be assigned then do so\n                      parentSet(parentScope, lastValue = scope[scopeName]);\n                    }\n                  }\n                  return parentValue;\n                }; newVal: {\"baz\":3}; oldVal: {\"baz\":3}"],["fn: function () {\n                  var parentValue = parentGet(parentScope);\n\n                  if (parentValue !== scope[scopeName]) {\n                    // we are out of sync and need to copy\n                    if (parentValue !== lastValue) {\n                      // parent changed and it has precedence\n                      lastValue = scope[scopeName] = parentValue;\n                    } else {\n                      // if the parent can be assigned then do so\n                      parentSet(parentScope, lastValue = scope[scopeName]);\n                    }\n                  }\n                  return parentValue;\n                }; newVal: {\"baz\":3}; oldVal: {\"baz\":3}"]] angular.js:7729
Scope.$digest angular.js:7729
Scope.$apply angular.js:7894
(anonymous function) angular.js:930
invoke angular.js:2788
bootstrap angular.js:928
angularInit angular.js:904
(anonymous function) angular.js:14397
trigger angular.js:1695
(anonymous function) angular.js:1930
forEach angular.js:110
eventHandler angular.js:1929

なぜこうなった?=縛りの関係もあると思います。

4

3 に答える 3

15

これは、ダイジェスト サイクルを通過するたびに新しいオブジェクトを作成しているためです。ウォッチはこの=データ バインディングに登録されているため、評価するたびにbar="{baz: 3}"新しいオブジェクトが作成されるため、以前の値とは異なり、別のダイジェスト ループがトリガーされます。最終的には、無限にループしないように中止します。詳細な説明については、 http://docs.angularjs.org/guide/concepts#runtimeを参照してください。

トリックは、=毎回変更されない参照を使用してデータ化を行うことです。これは通常、ディレクティブの外側のスコープ内に置くことによって行われます。http://jsfiddle.net/u4BTu/7/を参照

于 2012-11-28T00:12:00.577 に答える
0

このコードをアプリケーション定義または app.js に追加します。これにより、アプリケーションの digestTtl が増加します。

yourApp.config(function ($rootScopeProvider) {
       $rootScopeProvider.digestTtl(15); 
       // 15 is int value, just set to more than 10. If not works justincrement it bye one every-time and refresh page to test
  })
于 2016-11-24T07:44:03.097 に答える
0

HTML テンプレートでオブジェクト リテラル表現を実現する方法があります。

<div my-directive="{ param: 34, param2: 'cool' }" another-param="parentScopeObject"></div>

var directiveFunction = function(){
    return {
        scope: {
            myDirective: '&',
            anotherParam: '&'
        },
        link: function(scope, element, attributes){

            //this will return the actual object from the object expression!
            console.log(scope.myDirective());
            //this will return the actual object from the parent scope, if it exists of course!
            //and no "parentScopeObject" is not a function, it's an object
            console.log(scope.anotherParam());

        }
    };
}

これは、Angular バインディングの例のリストから抜粋したものです。6 番を参照してください: https://gist.github.com/CMCDragonkai/6282750

于 2014-02-26T12:56:06.710 に答える