2015-09-04 5 views
9

Lavorare su un'applicazione Ionic che esegue sia su Android che su Windows.Servizi angolari con valori predefiniti per attributi non esistenti

Non ci sono servizi, come ionico di $ionicLoading, che abbiamo ridefinire le funzionalità in modo da funzionare correttamente in Windows:

angular.factory('$ionicLoading', function(){ 
    return { 
     show: function(){...} // custom implementation 
     hide: function(){...} // custom implementation 
    } 
}); 

ma ci sono altri servizi che dobbiamo ignorare solo per non interrompere l'applicazione. In questo caso sarebbe davvero utile fornire un servizio che non farà nulla. Per esempio:

angular.factory('$ionicExampleService', function(){ 
    return { 
     *foo*: angular.noop // for operations 
     *bar*: promise // returns promise 
    } 
}); 

Nota: So che un modo migliore di fare questo sarebbe con un servizio che sceglie tra l'attuazione del ionico o un fatto uno, ma questo è solo per il gusto di apprendimento.

L'ideale sarebbe andato anche oltre, sarebbe magnifico per essere in grado di restituire qualcosa di ancora più a prova di proiettile. Qualcosa come servizi flessibili generici:

angular.factory('$ionicPopup', function(){ 
    return /*magic*/; 
}); 

$ionicPopup.show({...}) // show was not defined 
    .then(foo); // won't break and will execute foo() 

È possibile?

+6

Questa domanda ha una risposta molto bella qui: http://stackoverflow.com/questions/6600868/set-default-value-of-javascript-object-attributes – sunny

+0

Ho ampliato un po 'la risposta di Sunny per aiutarlo a situazione. Ho anche rimosso il tuo voto -1. -C§ – CSS

risposta

-3

utilizzare var a = {}; per dichiarare una nuova variabile.

0

Utilizzando una valutazione per ogni assegnazione in base a una proprietà dell'oggetto, simile a questo:

myVar = myObj.myPropVar === undefined ? "default replacement" : myObj.myPropVar; 

In sostanza si sta utilizzando un assegno per se la proprietà è stata definita, sostituendo un valore predefinito se hasn' t, e assegnandolo se lo ha.

In alternativa, è possibile utilizzare una versione modificata della funzione globale nel linkback di Sunny per definire i valori predefiniti per tutte quelle proprietà che si potrebbe ritenere non definite in punti specifici del codice.

function getProperty(o, prop) { 
    if (o[prop] !== undefined) return o[prop]; 
    else if(prop == "foo") return "default value for foo"; 
    else if(prop == "bar") return "default value for bar"; 
    /* etc */ 
    else return "default for missing prop"; 
} 

Speranza che aiuta,

ç§

4

Da quello che ho capito è necessario sostituire l'attuazione dei servizi esistenti. Puoi farlo con un decoratore di servizi angolari.

Un decoratore di servizi intercetta la creazione di un servizio, consentendo di ignorare o modificare il comportamento del servizio. L'oggetto restituito dal decoratore può essere il servizio originale o un nuovo oggetto servizio che sostituisce o avvolge e delega al servizio originale.

Per ulteriori informazioni è possibile controllare angolare documentation. Un semplice esempio potrebbe essere:

app.factory('someService', function() { 
    return { 
     method1: function() { return '1'; } 
     method2: function() { return '2'; } 
    }; 
}); 

app.decorator('someService', function ($delegate) { 
    // NOTE: $delegate is the original service 

    // override method2 
    $delegate.method2 = function() { return '^2'; }; 

    // add new method 
    $delegate.method3 = function() { return '3'; }; 

    return $delegate; 
}); 

// usage 
app.controller('SomeController', function(someService) { 
    console.log(someService.method1()); 
    console.log(someService.method2()); 
    console.log(someService.method3()); 
}); 

MODIFICA: Domanda - Come sovrascrivere ogni metodo nel servizio?

var dummyMethod = angular.noop; 

for(var prop in $delegate) { 
    if (angular.isFunction($delegate[prop])) { 
     $delegate[prop] = dummyMethod; 
    } 
} 

Spero che questo ti aiuti.

+0

Il problema è che voglio sovrascrivere ogni metodo che 'someService' ha senza conoscere la sua implementazione. Qualcosa come '$ delate.everyMethod = function() {return 'hello world!'; }; ' – fuxes