2013-10-31 5 views
6

मैं नॉकआउटज का अध्ययन कर रहा हूं और कुछ समस्याएं हैं। मेरे पास एएसपी.नेट एमवीसी पेज है जिसमें तीन कार ऑब्जेक्ट्स की विधि लौटने वाली सूची JSON है। मैं इसे HTML दृश्य में select पर मैप करने के बजाय और चयन चयन पर किसी चयनित कार की लागत प्रदर्शित करना चाहता हूं। समस्या यह है कि एक कार का नाम दिखाई देता है जबकि कीमत नहीं होती है ('एक मर्सिडीज-बेंज लागत।')। यह क्या हो सकता है? अग्रिम में धन्यवाद! नियंत्रक:नॉकआउटज बाध्यकारी ऑब्जेक्ट्स समस्या

public class Car 
{ 
    public string Make { get; set; } 
    public decimal Price { get; set; } 
} 
public JsonResult GetCars() 
{ 
    List<Car> cars = new List<Car>(); 
    cars.Add(new Car { Make = "Mercedes-Benz", Price = 103000 }); 
    cars.Add(new Car { Make = "Toyota", Price = 37000 }); 
    cars.Add(new Car { Make = "Huyndai", Price = 17000 }); 
    return Json(cars, JsonRequestBehavior.AllowGet); 
} 

और जावास्क्रिप्ट कोड के साथ देखें:

<head> 
    <script type="text/javascript" src="~/Scripts/jquery-2.0.3.min.js"></script> 
    <script type="text/javascript" src="~/Scripts/knockout-3.0.0.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      function Car(data) { 
       this.Make = ko.observable(data.Make); 
       this.Price = ko.observable(data.Price); 
      } 

      function CarsViewModel() { 
       var self = this; 
       //Data 
       self.someOptions = ko.observableArray([]); 
       self.myOption = ko.observable(); 

       //Operations 
       self.initData = function() { 
        $.get('/Home/GetCars', function (data) { 
         var mappedCars = $.map(data, function (item) { return new Car(item) }); 
         self.someOptions(mappedCars); 
        }); 
       } 
      } 

      ko.applyBindings(new CarsViewModel()); 
     }); 

    </script> 
</head> 
<body> 
    <div> 
     <button data-bind="click: initData">Load data</button> 
     <h4>Preview</h4> 
     <p> 
      <select data-bind="options: someOptions, optionsText: 'Make', value: myOption"></select><br /> 
      A <span data-bind="text: myOption().Make"></span> costs <span data-bind="text: myOption().Price"></span>. 
     </p> 
    </div> 
</body> 

उत्तर

15

आप अपने ब्राउज़र का JavaScript कंसोल को चेक करते हैं आपको निम्न त्रुटि देखना चाहिए:

Uncaught TypeError: Unable to process binding "text: function (){return myOption().Make }" Message: Cannot read property 'Make' of undefined

आपको यह त्रुटि प्राप्त क्योंकि जब आपका पृष्ठ लोड हो गया है myOption खाली है इसलिए इसमें Make और Price गुण नहीं हैं। तो केओ बाध्यकारी data-bind="text: myOption().Make" निष्पादित नहीं कर सकता है और यह आगे की बाइंडिंग के प्रसंस्करण के साथ बंद हो जाता है।

initData पर कॉल करने के बाद अब आपके पास myOption में कुछ है लेकिन अभी भी data-bind="text: myOption().Make" के बाद सभी बाइंडिंग काम नहीं करेंगे।

इस का समाधान वहाँ जैसे कई तरीके हैं करने के लिए: data-bind="text: myOption() && myOption().Make"

  • के साथ अपने बाइंडिंग में अशक्त के लिए
  • जांच myOption में एक डिफ़ॉल्ट मान का उपयोग कर

    का उपयोग with बाध्यकारी के लिए एक उदाहरण है:

    <!-- ko with: myOption --> 
        A <span data-bind="text: Make"></span> 
        costs <span data-bind="text: Price"></span>. 
    <!-- /ko --> 
    

    डेमो JSFiddle

  • +0

    स्पष्टीकरण के लिए धन्यवाद! – IDeveloper

    संबंधित मुद्दे