2013-03-04 9 views
6

Bazı kullanıcılarımız hala IE8 üzerindedir. Bazıları zaman zaman sunucularımıza veri göndermeye çalışırken ("KAYDET" etiketli büyük bir düğmeyle) sorunları bildiriyorlar.IE8 ile KnockoutJS, Stringify ile ara sıra sorunlar?

olduğunu IE8 gösteriyor ki bir komut dosyası hatası vardır: yöntem veya özellik erişimi-Beklenmedik çağrı, hep kütüphane, hat 450, (şimdilik, hata ayıklama) KnockoutJS aynı çizgiye 2.2.0 işaret hangi aşağıdaki gibidir:

self.saveSingle = function (onSuccess, onFailure) { 
     ko.utils.arrayForEach(self.days(), function (day) { 
      day.close(); 
     }); 
     var jsonData = ko.toJSON(self); 
     $.ajax({ 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      url: applicationLocation + "/api/assignmentapi/save", 
      data: jsonData, 
      success: function (data) { 
       self.status(data.Status); 
       self._isDirty(false); 
       ko.utils.arrayForEach(self.days(), function (day) { 
        day.clean(); 
       }); 
       if (onSuccess) 
        onSuccess(); 
      }, 
      error: function (data) { 
       onFailure(); 
      }, 
      dataType: "json" 
     }); 
    }; 

Biz gerekli olmayan bir takım özelliklerinin dışında şerit yapın:

return JSON.stringify(ko.utils.unwrapObservable(data), replacer, space); 

Bu durumda yığın izleme kökünde benim kod yöntemi şudur dönüştürdüğümüz gibi POST'umuza Bu yaklaşımı kullanarak, JSON itiraz: Bu, bu hat üzerinde sürekli başarısız başarısızhttp://www.knockmeout.net/2011/04/controlling-how-object-is-converted-to.html

OurType.prototype.toJSON = function() { 
    var copy = ko.toJS(this); 

    delete copy.someUnneededProperty1; 
    delete copy.someUnneededProperty2; 
    delete copy.someUnneededProperty3; 
    delete copy.someUnneededProperty4; 

    return copy; 
} 

var jsonData = ko.toJSON(self); 

işte gerçek karmaşa gelir:

  1. O değil
  2. sürekli olarak gerçekleşiyor Bu, tüm IE8 kullanıcıları için geçerli değildir
  3. Biz sürekli hiçbir fikrim yok IE8

cevap

1

için o anki sürümü

  • , konuyu
  • jscript.dll görünmüyor seri ediyoruz bizim modelin yapısı olduğunu yeniden olamaz Bu tamir, ancak JS ve JSON arasında gitmek için mapping plugin kullanabilirsiniz eğer:
    var mapping = { 
        'ignore': ["propertyToIgnore", "alsoIgnoreThis"] 
    } 
    var viewModel = ko.mapping.toJS(data, mapping); 
    

    benim answer to this question

    Alındığı

    Bunu bir deneyin ve yaklaşımınızda açıkça bir yanlışlık olmadığı için yardımcı olup olmadığına bakarım.

  • 0

    Soruna isabet eden IE8 kullanıcılarının olduğundan emin misiniz? IE7 does not support JSON.stringify. IE7'yi desteklemek ve daha düşük yapmak için json2.js library'u eklemeniz gerekir.

    +0

    IE7 kullanıcıları için json2'yi dahil ediyoruz. IE7 kullanıcısı bir sorun bildirmedi; sadece IE8 kullanıcıları. – reallyJim

    +0

    İlginç. IE8 kullanıcılarının aslında IE7 öykünme modunda (IE sayfası uyumluluğu) çalıştırılması olabilir mi? –

    +0

    QA personelimiz, * bazen * çoğaltabiliyor ve bunu yaptıklarında IE8 modunda. – reallyJim

    2

    Ayrıca bu sorunu yaşıyordum. Sadece ara sıra başarısız oldu

    • , ben yuttu ediliyordu konsola enter image description here
    • data-bind kod mesajının dışında bir istisna trowing edildi kodu çalıştırarak bu bulundu: bir kaç şey buldum derin Kazı IE8 nedeniyle bir try {} finally {} bloğu kullanırken (catch olmadan) mesaja giderken.
    • Denemeyi kaldırma işlemi sonunda, ayrıştırılamıyor ileti iletisini ortaya çıkardı.

    Meseleyi anlamaya başladığımda (nakavt kodunun derinliklerine inerek) gözümün önünde kaybolmuş gibi görünüyordu. Bu kodun sonuna istisna yakalamak, o üzerinde başarısız oldu kod bölümüdür:

    ko.utils.extend(ko.bindingProvider.prototype, { 
        'nodeHasBindings': function(node) { 
         switch (node.nodeType) { 
          case 1: return node.getAttribute(defaultBindingAttributeName) != null; // Element 
          case 8: return ko.virtualElements.virtualNodeBindingValue(node) != null; // Comment node 
          default: return false; 
         } 
        }, 
    
        'getBindings': function(node, bindingContext) { 
         var bindingsString = this['getBindingsString'](node, bindingContext); 
         return bindingsString ? this['parseBindingsString'](bindingsString, bindingContext, node) : null; 
        }, 
    
        // The following function is only used internally by this default provider. 
        // It's not part of the interface definition for a general binding provider. 
        'getBindingsString': function(node, bindingContext) { 
         switch (node.nodeType) { 
          case 1: return node.getAttribute(defaultBindingAttributeName); // Element 
          case 8: return ko.virtualElements.virtualNodeBindingValue(node); // Comment node 
          default: return null; 
         } 
        }, 
    
        // The following function is only used internally by this default provider. 
        // It's not part of the interface definition for a general binding provider. 
        'parseBindingsString': function(bindingsString, bindingContext, node) { 
         try { 
          var bindingFunction = createBindingsStringEvaluatorViaCache(bindingsString, this.bindingCache); 
          return bindingFunction(bindingContext, node); 
         } catch (ex) { 
          throw new Error("Unable to parse bindings.\nMessage: " + ex + ";\nBindings value: " + bindingsString); 
         } 
        } 
    }); 
    

    Ama evet, sadece, tekrarlanabilir yüzden ben test edilmiş ve daha önce çalışan bir hack ile geldi olma durdu veri ayrıştırmayı yeniden denemek. Yani bu:

    data-bind="value: ko.computed(function(){return ko.toJSON(appViewModel.model()[0])})" 
    

    bu Oldu:

    data-bind="value: ko.computed(function(){while (true) { try { var json = ko.toJSON(appViewModel.model()[0]); return json; }catch(e){}}})" 
    

    Evet, çok yucky, ama bizim kullanıcılar artık IE8 veya Nakavt sorunun giderildiğini ihtiyaç kadar hileye neden olabilir.

    +0

    Tamam, bu çok şanslı. :) Şimdi, bunları doğrudan kendi nesnelerimizde kendi toJSON yöntemlerini oluşturarak geçiyoruz. Aşağı tarafı, çalışması gereken bir şeyi yeniden uygulamak yanlış hissettiriyor, ama şimdi kendi kendimizi yarattığımızdan, artık umurumda değilken malları silme adımını atmak zorunda değilim. Çift kenarlı kılıç, sanırım. – reallyJim