आईई 9 में मॉडल फंक्शन बाध्यकारी नहीं मिला है लेकिन एफएफ और क्रोम में काम करता है

Update I realize this question is difficult to follow given the implementation. To see and test a working sample please download the solution.

परीक्षण करने के लिए आपको IE9 का उपयोग करना होगा और विकास उपकरण खुले नहीं जा सकते हैं। देव उपकरण खोलने से प्रोजेक्ट अपेक्षित काम करेगा। यह समाधान किसी अन्य ब्राउज़र के साथ ठीक काम करता है। परीक्षण के लिए मैंने आईआईएस के भीतर स्थानीय रूप से समाधान स्थापित किया और इसे वीएस/डीबग के बाहर चलाया।


मेरे पास एक प्रोजेक्ट है जहां मैं एक नॉकआउट को वापस देखने के लिए देख रहा हूं। मैं आईई 9 में कुछ सचमुच अजीब चीजें देख रहा हूं कि मैं समझा नहीं सकता और मुझे उम्मीद है कि कोई मेरी मदद कर सकता है। मैं नॉकआउट के साथ एएसपी.नेट एमवीसी का उपयोग कर रहा हूं और परियोजना के इस हिस्से के लिए जेएस खुला मॉड्यूल पैटर्न लागू किया है। मेरी जेएस फाइलें निम्नानुसार हैं:

  • रिपोर्टराइटर.जेएस पैटर्न को प्रकट करने के लिए एचटीएमएल के लिए बुनियादी बाध्यकारी
  • ReportWriterEffects.js इसमें ऐसी कोई भी घटना होती है जो यूआई उत्पन्न करता है जो नॉकआउट व्यूमोडेल
  • ReportWriterUtilities.js। इसमें व्यूमोडेल
  • के भीतर डेटा/ऑब्जेक्ट हेरफेर के लिए फ़ंक्शन शामिल हैं
  • ReportWriterViewModel.js Reportwriter viewmodel जेसन serialization/serialization।

मेरे एचटीएमएल पेज में निम्नलिखित तत्व है


When this is clicked a non-obtrusive event is called from within the ReportWriterEffects.js

 $(document).on({

            click: function() {
                alert('click');// placed here for testing
                var context = ko.contextFor(this);
                context.$root.Save();
            }
        }, '#footerSaveButton');

इसे बदले में ReportWriterViewModel.js से कॉल करना चाहिए जो दिखता है

self.Save = function() {
            if (self.ValidateReport()) {

               //Transform the custom types in the myFilters collection into the form required by the server-side representation.
                self.TransformFilters();
                ReportWriterUtilities.Save(self.iqReport);
            }

जो मेरी रिपोर्ट को रिपोर्ट करने के लिए रिपोर्ट करता है WriterUtilities.js फ़ाइल जहां AJAX कॉल किया जाता है

function Save(reportObservable) {
 //Determine which method to call based upon the state of report modification.
  var command = reportObservable().IsNewReport() ? "SaveNewReport" : "UpdateExistingReport";
$.ajax({
    type: "POST",
    url: "../" + command,
    data: "{ json:'" +
    ko.toJSON(reportObservable, function (key, value) {//Remove the __type attribute. This causes problems with deserialization.
        if (key == "__type") {
            return;
        }
        else {
            return value;
        }
    }) + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    cache: false,
    success: function (msg) {
        if (msg.Key != null) {
           //Update the ViewModel with properties from the saved Report.
            reportObservable().ReportId(msg.Key.ReportId);
            reportObservable().DateLastModified(msg.Key.DateLastModified);

            AlertMessaging.DisplaySuccess("Report Saved!", 'Your Report has been saved and is available in your Report Library. Go to Report Library');
        }
        else {
           //Display an error with the given text.
            AlertMessaging.DisplayError("Problem Saving Report", msg.Value);
        }
    }, error: function (err) {
        AlertMessaging.DisplayError("Error Saving Report", "The Server returned an error code. Code: " + err.status);
    }
    });
}

In Firefox and Chrome this all works and the report is saved. However within IE the save call is never invoked. I originally had a knockout bind set on the element which was never invoked. I thought the browser cache may have been having an impact on this since I was using Mvc so I decorated the controller to not load cache by adding the following attribute to the controllers constructor

[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public class ReportLibraryController : RootController
{ ...

अभी भी कोई पासा नहीं है।

यदि आप AJAX कॉल को देखते हैं तो आप यह भी देखेंगे कि मैंने कैश: गलत सोचने में मदद की है जो मदद कर सकता है। अब तक कुछ भी नहीं।

मैंने चेतावनी संदेश जोड़ा और इसे संदर्भित किया गया लेकिन संदर्भ। $ Root.Save (); कभी नहीं कहा जाता है।

Now here is the really weird thing. When I load the page in IE9 and press F12 to open the dev tools in IE and then close the dev tools the save function within the viewmodel is called and everything works. If I launch the browser open dev tools and navigate to the page everything works. No errors or messages are generated in the console and it all works fine within other browsers. This seems isolated to IE9 as IE 10 works fine.

क्या किसी के पास कोई सुझाव है या आपने अतीत में ऐसा कुछ अनुभव किया है। मैं इस बारे में किसी अंतर्दृष्टि की सराहना करता हूं कि ऐसा होने के कारण क्या हो सकता है। मुझे आशा है कि नीचे दिया गया कोड पर्याप्त होगा। मैं बेवकूफ का उपयोग नहीं कर सकता क्योंकि मैं यहां खुलासा पैटर्न का उपयोग कर रहा हूं और यह कोड का सटीक प्रतिनिधित्व नहीं देता है।

0
@rlcrews: मुझे डर है कि इसका ko , या एक विशिष्ट पैटर्न से कोई लेना देना नहीं है। आईई की ग्लैमरस दुनिया में आपका स्वागत है!
जोड़ा लेखक o.v., स्रोत
@PWKad इस तरह मैंने शुरुआत में इसे सेटअप किया था। तत्व के भीतर मेरे पास डेटा-बाइंड = "क्लिक करें: $ root.Save"। इसने गैर-घुसपैठ की घटना के समान प्रभाव दिखाया। jQuery का उपयोग कम से कम अन्य कार्यों को कॉल करने में सक्षम था, लेकिन यह दृश्य मॉडल के भीतर कार्यों तक नहीं पहुंच पाएगा। मुझे नहीं लगता कि jQuery यहां मूल कारण है। यह अन्य ब्राउज़रों में काम करता है। अज्ञात कार्यों का संदर्भ देते समय मेरे पास गैर-घुसपैठ करने वाली घटनाओं का उपयोग पूरी तरह से स्वीकार्य है knockoutjs.com/ प्रलेखन/विन
जोड़ा लेखक rlcrews, स्रोत
टीएल: डीआर - आपको शायद समस्याएं हैं क्योंकि आप नॉकआउट को कॉल करने के लिए ईवेंट हैंडलिंग के लिए jQuery का उपयोग करने का प्रयास कर रहे हैं। क्लिक बाइंडिंग से छुटकारा पाएं और उन्हें ठीक से बाध्य करें
जोड़ा लेखक PW Kad, स्रोत

1 उत्तर

In IE8&9, console is undefined whenever F12 developer tools have not been initialized for the current document (afaik, old versions of firebug suffered from this as well).

आपका self.Save console.log ('VM पहुंचा') पर असफल प्रतीत होता है; ReportWriterViewModel.js (13) में। अन्य स्थान भी हो सकते हैं, लेकिन यह है कि जहां तक ​​मेरा कारीगर स्थिर कोड विश्लेषण मुझे प्राप्त करता है (VisualStudio IDE तक कोई पहुंच नहीं है ... या असत्यापित समाधानों के लिए विश्वास :)

जब तक कि console कॉल को उत्पादन कोड से हटाया जाता है, तब तक आप डेवलपर टूल के साथ सामान्य रूप से व्यवसाय को विकसित करना जारी रख सकते हैं - यह मेरी निजी वरीयता होगी।

वैकल्पिक रूप से, आप एक नोप के साथ कंसोल विधियों को "प्लग" करना चुन सकते हैं (एक विधि जो कुछ भी नहीं करती है):

/*https://stackoverflow.com/a/9593812/1081234*/
if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function() { };

This answer deserves attention as well, since it plugs other console methods.

4
जोड़ा
@rlcrews: मुझे यह मदद करने में खुशी हुई। हमने कुछ समय पहले इसी तरह की समस्या में भाग लिया है और ऐसा लगता है कि एमएसडीएन अभी भी इस और अन्य मुद्दों के बारे में अस्पष्ट है। आईएमएचओ, यह बेहद आकर्षक है कि कितने डेवलपर पूरे में खरीद रहे हैं "आईई 9 + इतना अच्छा ब्राउज़र है!" मार्केटिंग अभियान।
जोड़ा लेखक o.v., स्रोत
@ ओ.वी. वह मुद्दा था। मेरे सत्यापन कार्यों में से एक के भीतर Nested मैं एक console.log घटना थी। कभी सोचा नहीं था कि यह मुद्दा होना था लेकिन यह था। ब्राउज़र के उन संस्करणों में कंसोल पर अंतर्दृष्टि के अंतर्दृष्टि के लिए धन्यवाद
जोड़ा लेखक rlcrews, स्रोत