2014-07-09 14 views
7

En son projemde Ember.js, sürüm 1.7.0-beta.1 kullanıyorum. Bir listeyi sert bir yenilemeden kurtulmak için query params özelliğini kullanıyorum (örneğin, yeniden yüklendikten sonra listedeki seçili öğeler hala seçili).Sorgu paramları için kodlama URL'si Ember.js

Ben yöneten bir denetleyici var olduğunu:

export default Ember.ObjectController.extend({ 
    queryParams: [{selectedFiles: 'files'}], 
    selectedFiles: Ember.A([]), //list of file ids 

    ... //other props 

    actions: { 
    selectFile: function(file) { 
     //set or remove the file id to the selectedFiles property 
    } 
}); 

Harikaydı çalışır, ancak bir şartla:

Krom & IE:

yol url url kodlanmış olan/354? Files =% 5B "6513"% 2C "6455"% 2C "6509"% 2C "6507"% 2C "6505"% 2C "6504"% 2C "6511"% 5D

?

yol/354 dosya = "6513" % 2C "6455" % 2C "6509" % 2C "6507" % 2C "6505" % 2C":

FF (otomatik parantez setleri) 6504 "% 2C" 6511" ]

daha Okunması biçime sorgu-param-string şifresini çözmek için Ember bir yolu var mı? Belki decodeURIComponent() işlevini bir yerlerde kullanabilir miyim?

istenen çıkış:

yolu/354 dosya = [ "6513", "6455", "6509", "6507", "6505", "6504", "6511"]

cevap

11

Ben çok benzer bir sorun vardı ve o rotada serializeQueryParam ve deserializeQueryParam geçersiz kılarak çalışma yaptı.

queryParams: ['files'], 
files: [] 

Ve rotada: denetleyici olarak

Eğer olurdu

serializeQueryParam: function(value, urlKey, defaultValueType) { 
    if (defaultValueType === 'array') { 
     return value; 

     // Original: return JSON.stringify(value); 
    } 
    return '' + value; 
    }, 

ve:

:

deserializeQueryParam: function(value, urlKey, defaultValueType) { 

    if (defaultValueType === 'array') { 

     var arr = []; 
     for (var i = 0; i < value.length; i++) { 
     arr.push(parseInt(value[i], 10)); 
     }  

     return arr; 

     // Original: return Ember.A(JSON.parse(value)); 
    } 

    if (defaultValueType === 'boolean') { 
     return (value === 'true') ? true : false; 
    } else if (defaultValueType === 'number') { 
     return (Number(value)).valueOf(); 
    } 
    return value; 
    }, 

url sonra böyle bir şey olacak

?files[]=1&files[]=2&files[]=3 

Sunucu tarafında gerçek bir dizi olacak.

Take a look at this working example on jsbin.com

+0

Harika, bu kancalar tam olarak ihtiyacım olan şey. Teşekkürler! –

+0

Yukarıdaki yaklaşımı denedim, ancak 'her bir değerlerini' parseInt() olmadan 'value' döndürmek için 'deserializeQueryParam()' değişti. Sorun şu ki, sorgu parametreleri ile denetleyicinin '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' değerindeki bağlar, değerin ne zaman değiştirildiğini anlayamadığı görülmektedir Bu yüzden de, "relerializeQueryParam()" içindeki '' '' 'de' 'copy'()' i çağırmak zorunda kaldım. Böylece, Ember, değerin ne zaman güncellendiğini fark edecekti. Bu konu üzerinde başka biri sıkışırsa sadece bir kafa. – jessepinho