2015-07-22 22 views
7

Bene, non c'è molto da spiegare. https://jsbin.com/raqajelufu/edit?html,js,output L'eccezione di invocazione non valida viene generata su qualsiasi accesso alla proprietà dell'oggetto File dopo essere stata copiata con angular.copy.Angular.js Invocazione illegale su oggetto file copiato

Esiste una soluzione alternativa che potrebbe rendere possibile la visione di File oggetto, considerando che $ watch utilizza angular.copy internamente in base allo https://docs.angularjs.org/api/ng/type/$rootScope.Scope?

+0

Hai provato con $ watch o solo chiamando la copia esplicitamente come nel tuo esempio? Probabilmente si può aggirare il problema fornendo una destinazione da copiare, poiché il problema sembra essere quando tenta di crearne uno internamente usando Object.create (...), anche se personalmente non so come risolvere il problema se si ottiene errore con $ watch quando chiama copia stessa .. – aw04

+0

Penso che il tuo problema non è con la copia ma con l'istanziazione, vedi http://stackoverflow.com/questions/8390855/how-to-instantiate-a-file-object- in-javascript – yvesmancera

+1

Chiamando 'var f = new File ([]," ")' e quindi 'f.name' non produce un errore, quindi continuo a pensare che il problema sia con la copia – Vasaka

risposta

3

Su quale browser si verifica il problema?

Un similar question è stato chiesto qualche tempo fa, che ha concluso che si potrebbe avere a che fare con Chrome V43.

Alcune risorse relative alla questione:

Presumibilmente, Chrome V43 fa Non come la seguente nel angular.copysource:

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

Si potrebbe provare una delle seguenti per vedere se si sopprime i vostri errori (indipendentemente dal browser di scelta):

  • Non usare angular.copy , evitando gli orologi profondi a la $scope.$watch('', fn, true) (jsbin) e vai per qualcosa come _.cloneDeep (jsbin) da lodash quando hai bisogno di fare una copia profonda di qualcosa.
  • Torna a Chrome v42 (se sei su v43).
  • Tornare indietro ad Angular 1.2.28 dove angular.copy non chiama la riga sopra. source (jsbin)

Se si vuole guardare in profondità ma evitare angular.copy, vorrei fare qualcosa di simile (con l'aiuto di lodash.merge):

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

yet another jsbin

Quello in questo modo non chiameresti angular.copy e avresti ancora una configurazione di 'deep watch'. Bare a mente, questo è un esempio molto ingenuo e non l'ho testato a fondo, ma penso che potresti farlo funzionare in modo molto simile a un orologio angolare con il minimo sforzo.


Disclaimer:non ho davvero scavato che in profondità in ciò che sta realmente accadendo alla fonte angular.copy, la e/o Chrome V43 console.È un po 'un'area grigia, ma con i suggerimenti di cui sopra devo ancora scatenare un'invocazione illegale.

Problemi correlati