2013-03-14 21 views
36

Sto passando dal fare affidamento su jQuery alla creazione di app in AngularJS. È consigliato in un number of places a non mix jQuery e codice angolare.

Una cosa che mi manca è la funzione $ .map di jQuery per gli array. So che questo potrebbe essere riscritto utilizzando il nativo Javascript map function, ma questo non è implementato in tutti i browser (in particolare, IE < v9).

Quindi, c'è un equivalente angolare, o dovrei tornare a scrivere for (var x = 0; x < foo; x += 1) {...} così posso smettere di includere jQuery?

UPDATE A volte sapere cosa cercare è tutto ciò di cui hai bisogno. Bergie dice "cerca polyfills". Ecco una guida di riferimento (da parte dell'equipaggio Modernizr) per un gruppo di risorse per far funzionare il codice moderna su browser più vecchi: HTML5 Cross Browser Polyfills

+1

È possibile includere solo un polyfill ES5, sono semplici e precisi per le funzioni di iterazione dell'array. – Bergi

+5

Angular non è pensato per essere una libreria JS. È un framework per la creazione di app a pagina singola. Sebbene abbia una manciata di funzioni di utilità (si veda [angular.forEach] (http://docs.angularjs.org/api/angular.forEach)) non tenta di dirti come gestire le operazioni JS di basso livello. Ecco a cosa servono Lo-Dash/Underscore e gli amici. – Stewie

+0

In aggiunta a quanto menzionato da @Stewie, dopo un po 'di tempo Angular è andato e ha scaricato una manciata di jQuery e l'ha chiamato JQLite - quindi stai usando un sacco di jQuery quando usi Angular che ti piaccia o no. Può anche usarlo. Sebbene ci siano ancora molti sprechi in cose come Angular's forEach, sarebbe meglio sfruttare jquery se presente. http://docs.angularjs.org/api/angular.element –

risposta

26

Controllare qui: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map

Mozilla ha fornito un polyfill Array.map per i browser non supportati

if (!Array.prototype.map) { 
    Array.prototype.map = function(callback, thisArg) { 

    var T, A, k; 

    if (this == null) { 
     throw new TypeError(" this is null or not defined"); 
    } 

    // 1. Let O be the result of calling ToObject passing the |this| value as the argument. 
    var O = Object(this); 

    // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". 
    // 3. Let len be ToUint32(lenValue). 
    var len = O.length >>> 0; 

    // 4. If IsCallable(callback) is false, throw a TypeError exception. 
    // See: http://es5.github.com/#x9.11 
    if (typeof callback !== "function") { 
     throw new TypeError(callback + " is not a function"); 
    } 

    // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. 
    if (thisArg) { 
     T = thisArg; 
    } 

    // 6. Let A be a new array created as if by the expression new Array(len) where Array is 
    // the standard built-in constructor with that name and len is the value of len. 
    A = new Array(len); 

    // 7. Let k be 0 
    k = 0; 

    // 8. Repeat, while k < len 
    while(k < len) { 

     var kValue, mappedValue; 

     // a. Let Pk be ToString(k). 
     // This is implicit for LHS operands of the in operator 
     // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. 
     // This step can be combined with c 
     // c. If kPresent is true, then 
     if (k in O) { 

     // i. Let kValue be the result of calling the Get internal method of O with argument Pk. 
     kValue = O[ k ]; 

     // ii. Let mappedValue be the result of calling the Call internal method of callback 
     // with T as the this value and argument list containing kValue, k, and O. 
     mappedValue = callback.call(T, kValue, k, O); 

     // iii. Call the DefineOwnProperty internal method of A with arguments 
     // Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true}, 
     // and false. 

     // In browsers that support Object.defineProperty, use the following: 
     // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true }); 

     // For best browser support, use the following: 
     A[ k ] = mappedValue; 
     } 
     // d. Increase k by 1. 
     k++; 
    } 

    // 9. return A 
    return A; 
    };  
} 
+0

Ottimo! diretto e preciso. – Benmj

+1

OP ha un collegamento a quella stessa pagina nella domanda ... ma forse non ha visto la patch? –

+0

@thesystem: ammetto di averlo sorvolato in fretta. – Benmj

13

No, non esiste un equivalente in Angolare. E come hai scoperto, non hai bisogno di ricorrere alla scrittura del codice imperativo.

Invece, basta usare la funzione map che è incorporata direttamente in JavaScript. Se è necessario supportare IE8, inserire polyfill all'inizio degli script.

Problemi correlati