2015-07-22 4 views
7

Nun, es gibt nicht wirklich viel zu erklären. https://jsbin.com/raqajelufu/edit?html,js,output Illegale Aufrufausnahme wird bei jedem Dateiobjekteigenschaftenzugriff nach dem Kopieren mit angular.copy ausgelöst.Angular.js Illegaler Aufruf des kopierten Dateiobjekts

Gibt es eine Problemumgehung, die das Beobachten nach Dateiobjekt möglich machen würde, wenn man bedenkt, dass $ watch angular.copy intern nach verwendet?

+0

Haben Sie versucht mit $ watch oder nur Aufruf von Kopie explizit wie in Ihrem Beispiel? Sie können wahrscheinlich umgehen, indem Sie ein Ziel zum Kopieren bereitstellen, da das Problem darin zu liegen scheint, wenn intern versucht wird, eines mit Object.create (...) zu erstellen, obwohl ich persönlich nicht weiß, wie ich umgehen kann Fehler mit $ watch, wenn es ruft kopieren selbst .. – aw04

+0

Ich denke, Ihr Problem ist nicht mit dem Kopieren, sondern mit Instanziierung, siehe http://StackOverflow.com/Questions/8390855/How-to-Instantiate-Afile-Objekt- in-javascript – yvesmancera

+1

Aufruf 'var f = neue Datei ([]," ")' und dann 'f.name' ergibt keinen Fehler, also denke ich immer noch, dass das Problem mit dem Kopieren – Vasaka

Antwort

3

In welchen Browsern sehen Sie das Problem?

A similar question gefragt wurde, vor einer Weile dem Schluss gekommen, dass es konnte mit Chrome v43 zu tun haben.

Einige der Frage verwandte Quellen an:

Angeblich soll, tut Chrome v43 nicht wie folgt in der angular.copysource:

var emptyObject = Object.create(Object.getPrototypeOf(source)); 

Sie eine der folgenden Aktionen könnten versuchen, um zu sehen, ob es Ihren Fehler unterdrückt (unabhängig von Ihrem Browser der Wahl):

  • Dont verwenden angular.copy Vermeiden Sie tiefe Uhren a la $scope.$watch('', fn, true) (jsbin) und gehen Sie für etwas wie _.cloneDeep (jsbin) von lodash, wenn Sie eine tiefe Kopie von etwas machen müssen.
  • Schritt zurück zu Chrome v42 (wenn Sie auf V43 sind).
  • Schritt zurück zu Angular 1.2.28 wo angular.copy nicht die obige Zeile aufrufen. source (jsbin)

Wenn Sie tief sehen wollen aber angular.copy vermeiden, würde ich so etwas wie dieses (mit Hilfe von lodash.merge) tun:

$scope.$watch(function() { 
    return _.merge(src, dest); 
}, callback); 

yet another jsbin

That So würdest du nicht angular.copy anrufen und du hättest immer noch ein 'Deep Watch' Setup. Das ist ein sehr naives Beispiel und ich habe es nicht gründlich getestet, aber ich denke, dass man es mit minimaler Anstrengung sehr ähnlich wie eine winkeltiefe Uhr machen kann.


Haftungsausschluss:Ich habe gegraben nicht wirklich so tief in das, was tatsächlich auf der angular.copy Quelle gehen, die console und/oder Chrom v43.Es ist etwas von einer Grauzone, aber mit dem obigen Vorschlag (s) muss ich noch eine Illegale Invokation auslösen.

Verwandte Themen