ASP.NET MVC ViewModels के साथ knockout.js का उपयोग कैसे करें?


129

इनाम

थोड़ी देर हो गई है और मेरे पास अभी भी कुछ बकाया सवाल हैं। मुझे आशा है कि एक इनाम जोड़कर शायद इन सवालों का जवाब मिल जाएगा।

  1. आप html सहायकों को नॉकआउट.जे के साथ कैसे उपयोग करते हैं
  2. यह काम करने के लिए दस्तावेज़ क्यों तैयार था (अधिक जानकारी के लिए पहले संपादन देखें)

  3. अगर मैं अपने व्यू मॉडल के साथ नॉकआउट मैपिंग का उपयोग कर रहा हूं तो मैं ऐसा कुछ कैसे करूं? चूंकि मैपिंग के कारण मेरा कोई फंक्शन नहीं है।

    function AppViewModel() {
    
        // ... leave firstName, lastName, and fullName unchanged here ...
    
        this.capitalizeLastName = function() {
    
        var currentVal = this.lastName();        // Read the current value
    
        this.lastName(currentVal.toUpperCase()); // Write back a modified value
    
    };
  4. मैं प्लगइन्स का उपयोग करना चाहता हूं उदाहरण के लिए मैं ऑब्जर्वर को रोलबैक करने में सक्षम होना चाहता हूं जैसे कि एक उपयोगकर्ता एक अनुरोध को रद्द करता है जो मैं पिछले मूल्य पर वापस जाने में सक्षम होना चाहता हूं। मेरे शोध से यह प्रतीत होता है कि लोग संपादन जैसे प्लगइन्स बना रहे हैं

    अगर मैं मैपिंग का उपयोग कर रहा हूं तो मैं कुछ इस तरह कैसे उपयोग करूं? मैं वास्तव में ऐसी पद्धति पर नहीं जाना चाहता जहाँ मेरे विचार में मेरी मैनुअल मैपिंग हो, मैं प्रत्येक MVC दृश्य क्षेत्र को KO मॉडल फ़ील्ड में मैप कर सकता था क्योंकि मैं यथासंभव कम इनलाइन जावास्क्रिप्ट चाहता हूँ और यह सिर्फ काम की तरह लगता है और वह है मुझे वह मैपिंग क्यों पसंद है।

  5. मुझे चिंता है कि इस काम को आसान बनाने के लिए (मैपिंग का उपयोग करके) मैं बहुत सारी KO शक्ति खो दूंगा, लेकिन दूसरी तरफ मुझे इस बात की चिंता है कि मैनुअल मैपिंग बस बहुत काम की होगी और मेरे विचार में बहुत अधिक जानकारी होगी और भविष्य में और मुश्किल हो सकता है (यदि मैं एमवीसी मॉडल में एक संपत्ति को हटाता हूं तो इसे को को व्यूमोडल में भी स्थानांतरित करना होगा)


मूल पोस्ट

मैं asp.net mvc 3 का उपयोग कर रहा हूं और मैं नॉकआउट में देख रहा हूं क्योंकि यह बहुत अच्छा लग रहा है, लेकिन मुझे यह पता लगाने में मुश्किल समय हो रहा है कि यह asp.net mvc के साथ कैसे काम करता है विशेष रूप से मॉडल देखें।

मेरे लिए अभी मैं कुछ ऐसा करता हूं

 public class CourseVM
    {
        public int CourseId { get; set; }
        [Required(ErrorMessage = "Course name is required")]
        [StringLength(40, ErrorMessage = "Course name cannot be this long.")]
        public string CourseName{ get; set; }


        public List<StudentVm> StudentViewModels { get; set; }

}

मेरे पास एक Vm होगा जिसमें कोर्सनाम की तरह कुछ बुनियादी गुण हैं और इसके शीर्ष पर कुछ सरल सत्यापन होगा। यदि आवश्यक हो तो Vm मॉडल में अन्य दृश्य मॉडल भी हो सकते हैं।

मैं तब इस Vm को व्यू में पास करूंगा मैं उपयोगकर्ता को इसे प्रदर्शित करने में मदद करने के लिए html हेल्पर्स का उपयोग करूंगा।

@Html.TextBoxFor(x => x.CourseName)

छात्र दृश्य मॉडल के संग्रह से डेटा प्राप्त करने के लिए मेरे पास कुछ फ़ॉरच लूप या कुछ हो सकते हैं।

फिर जब मैं फॉर्म जमा करूंगा तो मैं jquery का उपयोग करूंगा serialize arrayऔर इसे एक नियंत्रक एक्शन विधि में भेजूंगा जो इसे व्यूमॉडल में वापस बांध देगा।

नॉकआउट के साथ। यह सब अलग है क्योंकि अब आपको इसके लिए व्यूमॉडल मिल गए हैं और सभी उदाहरणों से मैंने देखा कि वे htmlers का उपयोग नहीं करते हैं।

आप MVC की इन 2 विशेषताओं को नॉकआउट.जे के साथ कैसे उपयोग करते हैं?

मुझे यह वीडियो मिला और यह संक्षेप में ( वीडियो के अंतिम कुछ मिनट @ 18:48) मूल रूप से एक इनलाइन स्क्रिप्ट के द्वारा व्यूमोडल का उपयोग करने के लिए जाता है जिसमें नॉकआउट। जेएस व्यूमॉडल है जो व्यूकोड में मूल्यों को असाइन करता है।

क्या ऐसा करने का एकमात्र तरीका है? इसमें मेरे विचार के संग्रह के साथ मेरे उदाहरण के बारे में कैसे? क्या मुझे सभी मूल्यों को बाहर निकालने और इसे नॉकआउट में असाइन करने के लिए एक फ़ॉरच लूप या कुछ करना होगा?

के रूप में html सहायकों के लिए वीडियो उनके बारे में कुछ नहीं कहता है।

ये 2 क्षेत्र हैं जो मुझे बाहर निकालने के लिए भ्रमित करते हैं क्योंकि बहुत से लोग इसके बारे में बात नहीं करते हैं और यह मुझे उलझन में छोड़ देता है कि प्रारंभिक मूल्यों और सबकुछ देखने को मिल रहा है जब कभी उदाहरण केवल कुछ कठिन-कोडित मूल्य उदाहरण है।


संपादित करें

मैं कोशिश कर रहा हूं कि डारिन दिमित्रोव ने क्या सुझाव दिया है और यह काम करने लगता है (मुझे हालांकि उनके कोड में कुछ बदलाव करने थे)। मुझे यकीन नहीं है कि मुझे तैयार दस्तावेज़ का उपयोग क्यों करना था लेकिन किसी तरह सब कुछ इसके बिना तैयार नहीं था।

@model MvcApplication1.Models.Test

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
    <script src="../../Scripts/jquery-1.5.1.js" type="text/javascript"></script>
    <script src="../../Scripts/knockout-2.1.0.js" type="text/javascript"></script>
    <script src="../../Scripts/knockout.mapping-latest.js" type="text/javascript"></script>
   <script type="text/javascript">

   $(function()
   {
      var model = @Html.Raw(Json.Encode(Model));


// Activates knockout.js
ko.applyBindings(model);
   });

</script>

</head>
<body>
    <div>
        <p>First name: <strong data-bind="text: FirstName"></strong></p>
        <p>Last name: <strong data-bind="text: LastName"></strong></p>
        @Model.FirstName , @Model.LastName
    </div>
</body>
</html>

मुझे इसे काम करने के लिए तैयार एक जॉकरी दस्तावेज़ के चारों ओर लपेटना पड़ा।

मुझे भी यह चेतावनी मिलती है। निश्चित नहीं है कि यह सब क्या है।

Warning 1   Conditional compilation is turned off   -> @Html.Raw

इसलिए मेरे पास एक शुरुआती बिंदु है जो मुझे लगता है कि कम से कम तब अपडेट होगा जब मैंने कुछ और खेल किया हो और यह कैसे काम करता हो।

मैं इंटरेक्टिव ट्यूटोरियल के माध्यम से जाने की कोशिश कर रहा हूं, लेकिन इसके बजाय एक ViewModel का उपयोग करें।

सुनिश्चित नहीं हैं कि इन भागों से कैसे निपटा जाए

function AppViewModel() {
    this.firstName = ko.observable("Bert");
    this.lastName = ko.observable("Bertington");
}

या

function AppViewModel() {
    // ... leave firstName, lastName, and fullName unchanged here ...

    this.capitalizeLastName = function() {
        var currentVal = this.lastName();        // Read the current value
        this.lastName(currentVal.toUpperCase()); // Write back a modified value
    };


संपादित करें २

मैं पहली समस्या का पता लगाने में सक्षम था। दूसरी समस्या के बारे में कोई सुराग नहीं। फिर भी हालांकि किसी को कोई विचार मिला?

 @model MvcApplication1.Models.Test

    @{
        Layout = null;
    }

    <!DOCTYPE html>

    <html>
    <head>
        <title>Index</title>
        <script src="../../Scripts/jquery-1.5.1.js" type="text/javascript"></script>
        <script src="../../Scripts/knockout-2.1.0.js" type="text/javascript"></script>
        <script src="../../Scripts/knockout.mapping-latest.js" type="text/javascript"></script>
       <script type="text/javascript">

       $(function()
       {
        var model = @Html.Raw(Json.Encode(Model));
        var viewModel = ko.mapping.fromJS(model);
        ko.applyBindings(viewModel);

       });

    </script>

    </head>
    <body>
        <div>
            @*grab values from the view model directly*@
            <p>First name: <strong data-bind="text: FirstName"></strong></p>
            <p>Last name: <strong data-bind="text: LastName"></strong></p>

            @*grab values from my second view model that I made*@
            <p>SomeOtherValue <strong data-bind="text: Test2.SomeOtherValue"></strong></p>
            <p>Another <strong data-bind="text: Test2.Another"></strong></p>

            @*allow changes to all the values that should be then sync the above values.*@
            <p>First name: <input data-bind="value: FirstName" /></p>
            <p>Last name: <input data-bind="value: LastName" /></p>
            <p>SomeOtherValue <input data-bind="value: Test2.SomeOtherValue" /></p>
            <p>Another <input data-bind="value: Test2.Another" /></p>

           @* seeing if I can do it with p tags and see if they all update.*@
            <p data-bind="foreach: Test3">
                <strong data-bind="text: Test3Value"></strong> 
            </p>

     @*took my 3rd view model that is in a collection and output all values as a textbox*@       
    <table>
        <thead><tr>
            <th>Test3</th>
        </tr></thead>
          <tbody data-bind="foreach: Test3">
            <tr>
                <td>    
                    <strong data-bind="text: Test3Value"></strong> 
<input type="text" data-bind="value: Test3Value"/>
                </td>
            </tr>    
        </tbody>
    </table>

नियंत्रक

  public ActionResult Index()
    {
              Test2 test2 = new Test2
        {
            Another = "test",
            SomeOtherValue = "test2"
        };

        Test vm = new Test
        {
            FirstName = "Bob",
            LastName = "N/A",
             Test2 = test2,

        };
        for (int i = 0; i < 10; i++)
        {
            Test3 test3 = new Test3
            {
                Test3Value = i.ToString()
            };

             vm.Test3.Add(test3);
        }

        return View(vm);
    }

2
मैंने एक अन्य समान प्रश्न का उत्तर देने के लिए सिर्फ एक ब्लॉग पोस्ट लिखा है: roysvork.wordpress.com/2012/12/09/… यह आपके प्रश्न का पूरी तरह से उत्तर नहीं दे सकता है, लेकिन यह आपको एक अच्छा विचार देता है कि चीजें कैसे काम कर सकती हैं। मुझे आशा है कि भविष्य में बहुत दूर नहीं एक और पोस्ट के साथ इसका पालन करेंगे। अगर आपको अधिक जानकारी चाहिए तो पोस्ट पर टिप्पणी में या यहाँ कोई भी प्रश्न पूछने के लिए स्वतंत्र महसूस करें।
परे-कोड

जवाबों:


180

मुझे लगता है कि मैंने आपके सभी प्रश्नों को संक्षेप में प्रस्तुत किया है, अगर मुझे कुछ याद आया तो कृपया मुझे बताएं ( यदि आप एक ही स्थान पर अपने सभी प्रश्नों को संक्षेप में बता सकते हैं तो अच्छा होगा =)

ध्यान दें। ko.editableप्लग-इन के साथ संगतता जोड़ी गई

पूरा कोड डाउनलोड करें

आप html सहायकों को नॉकआउट.जे के साथ कैसे उपयोग करते हैं

यह आसान है:

@Html.TextBoxFor(model => model.CourseId, new { data_bind = "value: CourseId" })

कहाँ पे:

  • value: CourseIdइंगित करता है कि आप अपने मॉडल और अपने स्क्रिप्ट मॉडल से संपत्ति के साथ नियंत्रण की valueसंपत्ति को बाध्य कर रहे हैंinputCourseId

परिणाम है:

<input data-bind="value: CourseId" data-val="true" data-val-number="The field CourseId must be a number." data-val-required="The CourseId field is required." id="CourseId" name="CourseId" type="text" value="12" />

यह काम करने के लिए दस्तावेज़ क्यों तैयार था (अधिक जानकारी के लिए पहले संपादन देखें)

मुझे अभी तक समझ नहीं आया कि आपको readyमॉडल को क्रमबद्ध करने के लिए इवेंट का उपयोग करने की आवश्यकता क्यों है , लेकिन ऐसा लगता है कि यह बस आवश्यक है (हालांकि इसके बारे में चिंता करने की ज़रूरत नहीं है)

अगर मैं अपने व्यू मॉडल के साथ नॉकआउट मैपिंग का उपयोग कर रहा हूं तो मैं ऐसा कुछ कैसे करूं? चूंकि मैपिंग के कारण मेरा कोई फंक्शन नहीं है।

अगर मैं सही ढंग से समझता हूं कि आपको KO मॉडल में एक नई विधि संलग्न करने की आवश्यकता है, तो यह आसान मर्जिंग मॉडल है

अधिक जानकारी के लिए, विभिन्न स्रोतों से मानचित्रण में-

function viewModel() {
    this.addStudent = function () {
        alert("de");
    };
};

$(function () {
    var jsonModel = '@Html.Raw(JsonConvert.SerializeObject(this.Model))';
    var mvcModel = ko.mapping.fromJSON(jsonModel);

    var myViewModel = new viewModel();
    var g = ko.mapping.fromJS(myViewModel, mvcModel);

    ko.applyBindings(g);
});

चेतावनी के बारे में आप प्राप्त कर रहे थे

चेतावनी 1 सशर्त संकलन बंद कर दिया गया है -> @ Html.Raw

आपको उद्धरण का उपयोग करने की आवश्यकता है

Ko.editable प्लग-इन के साथ संगतता

मुझे लगा कि यह अधिक जटिल होने जा रहा है, लेकिन यह पता चला है कि एकीकरण वास्तव में आसान है, अपने मॉडल को संपादन योग्य बनाने के लिए बस निम्नलिखित पंक्ति जोड़ें: (याद रखें कि इस मामले में मैं एक मिश्रित मॉडल का उपयोग कर रहा हूं, सर्वर से और ग्राहक में विस्तार और संपादन योग्य बस काम करता है ... यह बहुत अच्छा है):

    ko.editable(g);
    ko.applyBindings(g);

यहां से आपको बस प्लग-इन द्वारा जोड़े गए एक्सटेंशन का उपयोग करके अपने बाइंडिंग के साथ खेलना होगा , उदाहरण के लिए, मेरे पास मेरे फ़ील्ड्स को इस तरह संपादित करने के लिए एक बटन है और इस बटन में मैं संपादन प्रक्रिया शुरू करता हूं:

    this.editMode = function () {
        this.isInEditMode(!this.isInEditMode());
        this.beginEdit();
    };

फिर मेरे पास निम्नलिखित कोड वाले बटन हैं और रद्द करें:

    this.executeCommit = function () {
        this.commit();
        this.isInEditMode(false);
    };
    this.executeRollback = function () {
        if (this.hasChanges()) {
            if (confirm("Are you sure you want to discard the changes?")) {
                this.rollback();
                this.isInEditMode(false);
            }
        }
        else {
            this.rollback();
            this.isInEditMode(false);
        }
    };

और अंत में, मेरे पास यह इंगित करने के लिए एक फ़ील्ड है कि फ़ील्ड संपादन मोड में हैं या नहीं, यह सिर्फ सक्षम संपत्ति को बांधने के लिए है।

this.isInEditMode = ko.observable(false);

आपके सरणी प्रश्न के बारे में

छात्र दृश्य मॉडल के संग्रह से डेटा प्राप्त करने के लिए मेरे पास कुछ फ़ॉरच लूप या कुछ हो सकते हैं।

फिर जब मैं फॉर्म जमा करूँगा तो मैं jquery और सीरियलाइज़ ऐरे का उपयोग करूँगा और इसे एक नियंत्रक एक्शन विधि में भेजूँगा जो इसे व्यूमॉडल में वापस बाँध देगा।

आप KO के साथ भी ऐसा कर सकते हैं, निम्नलिखित उदाहरण में, मैं निम्नलिखित आउटपुट बनाऊंगा:

यहाँ छवि विवरण दर्ज करें

मूल रूप से, आपके पास दो सूचियाँ हैं, जिनका उपयोग करके Helpersऔर KO के साथ बाइंड किया गया है, उनके पास एक dblClickईवेंट बाइंड किया गया है, जब निकाल दिया गया है, तो चयनित सूची को वर्तमान सूची से हटा दें और जब आप पोस्ट करें, तो दूसरी सूची में जोड़ें Controller, प्रत्येक की सामग्री सूची JSON डेटा के रूप में भेजी जाती है और सर्वर मॉडल से फिर से जुड़ी होती है

नगेट्स:

बाहरी स्क्रिप्ट

नियंत्रक कोड

    [HttpGet]
    public ActionResult Index()
    {
        var m = new CourseVM { CourseId = 12, CourseName = ".Net" };

        m.StudentViewModels.Add(new StudentVm { ID = 545, Name = "Name from server", Lastname = "last name from server" });

        return View(m);
    }

    [HttpPost]
    public ActionResult Index(CourseVM model)
    {
        if (!string.IsNullOrWhiteSpace(model.StudentsSerialized))
        {
            model.StudentViewModels = JsonConvert.DeserializeObject<List<StudentVm>>(model.StudentsSerialized);
            model.StudentsSerialized = string.Empty;
        }

        if (!string.IsNullOrWhiteSpace(model.SelectedStudentsSerialized))
        {
            model.SelectedStudents = JsonConvert.DeserializeObject<List<StudentVm>>(model.SelectedStudentsSerialized);
            model.SelectedStudentsSerialized = string.Empty;
        }

        return View(model);
    }

नमूना

public class CourseVM
{
    public CourseVM()
    {
        this.StudentViewModels = new List<StudentVm>();
        this.SelectedStudents = new List<StudentVm>();
    }

    public int CourseId { get; set; }

    [Required(ErrorMessage = "Course name is required")]
    [StringLength(100, ErrorMessage = "Course name cannot be this long.")]
    public string CourseName { get; set; }

    public List<StudentVm> StudentViewModels { get; set; }
    public List<StudentVm> SelectedStudents { get; set; }

    public string StudentsSerialized { get; set; }
    public string SelectedStudentsSerialized { get; set; }
}

public class StudentVm
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Lastname { get; set; }
}

CSHTML पेज

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>CourseVM</legend>

        <div>
            <div class="editor-label">
                @Html.LabelFor(model => model.CourseId)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(model => model.CourseId, new { data_bind = "enable: isInEditMode, value: CourseId" })
                @Html.ValidationMessageFor(model => model.CourseId)
            </div>

            <div class="editor-label">
                @Html.LabelFor(model => model.CourseName)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(model => model.CourseName, new { data_bind = "enable: isInEditMode, value: CourseName" })
                @Html.ValidationMessageFor(model => model.CourseName)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.StudentViewModels);
            </div>
            <div class="editor-field">

                @Html.ListBoxFor(
                    model => model.StudentViewModels,
                    new SelectList(this.Model.StudentViewModels, "ID", "Name"),
                    new
                    {
                        style = "width: 37%;",
                        data_bind = "enable: isInEditMode, options: StudentViewModels, optionsText: 'Name', value: leftStudentSelected, event: { dblclick: moveFromLeftToRight }"
                    }
                )
                @Html.ListBoxFor(
                    model => model.SelectedStudents,
                    new SelectList(this.Model.SelectedStudents, "ID", "Name"),
                    new
                    {
                        style = "width: 37%;",
                        data_bind = "enable: isInEditMode, options: SelectedStudents, optionsText: 'Name', value: rightStudentSelected, event: { dblclick: moveFromRightToLeft }"
                    }
                )
            </div>

            @Html.HiddenFor(model => model.CourseId, new { data_bind="value: CourseId" })
            @Html.HiddenFor(model => model.CourseName, new { data_bind="value: CourseName" })
            @Html.HiddenFor(model => model.StudentsSerialized, new { data_bind = "value: StudentsSerialized" })
            @Html.HiddenFor(model => model.SelectedStudentsSerialized, new { data_bind = "value: SelectedStudentsSerialized" })
        </div>

        <p>
            <input type="submit" value="Save" data-bind="enable: !isInEditMode()" /> 
            <button data-bind="enable: !isInEditMode(), click: editMode">Edit mode</button><br />
            <div>
                <button data-bind="enable: isInEditMode, click: addStudent">Add Student</button>
                <button data-bind="enable: hasChanges, click: executeCommit">Commit</button>
                <button data-bind="enable: isInEditMode, click: executeRollback">Cancel</button>
            </div>
        </p>
    </fieldset>
}

स्क्रिप्ट

<script src="@Url.Content("~/Scripts/jquery-1.7.2.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/knockout-2.1.0.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/knockout.mapping-latest.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/ko.editables.js")" type="text/javascript"></script>

<script type="text/javascript">
    var g = null;
    function ViewModel() {
        this.addStudent = function () {
            this.StudentViewModels.push(new Student(25, "my name" + new Date(), "my last name"));
            this.serializeLists();
        };
        this.serializeLists = function () {
            this.StudentsSerialized(ko.toJSON(this.StudentViewModels));
            this.SelectedStudentsSerialized(ko.toJSON(this.SelectedStudents));
        };
        this.leftStudentSelected = ko.observable();
        this.rightStudentSelected = ko.observable();
        this.moveFromLeftToRight = function () {
            this.SelectedStudents.push(this.leftStudentSelected());
            this.StudentViewModels.remove(this.leftStudentSelected());
            this.serializeLists();
        };
        this.moveFromRightToLeft = function () {
            this.StudentViewModels.push(this.rightStudentSelected());
            this.SelectedStudents.remove(this.rightStudentSelected());
            this.serializeLists();
        };
        this.isInEditMode = ko.observable(false);
        this.executeCommit = function () {
            this.commit();
            this.isInEditMode(false);
        };
        this.executeRollback = function () {
            if (this.hasChanges()) {
                if (confirm("Are you sure you want to discard the changes?")) {
                    this.rollback();
                    this.isInEditMode(false);
                }
            }
            else {
                this.rollback();
                this.isInEditMode(false);
            }
        };
        this.editMode = function () {
            this.isInEditMode(!this.isInEditMode());
            this.beginEdit();
        };
    }

    function Student(id, name, lastName) {
        this.ID = id;
        this.Name = name;
        this.LastName = lastName;
    }

    $(function () {
        var jsonModel = '@Html.Raw(JsonConvert.SerializeObject(this.Model))';
        var mvcModel = ko.mapping.fromJSON(jsonModel);

        var myViewModel = new ViewModel();
        g = ko.mapping.fromJS(myViewModel, mvcModel);

        g.StudentsSerialized(ko.toJSON(g.StudentViewModels));
        g.SelectedStudentsSerialized(ko.toJSON(g.SelectedStudents));

        ko.editable(g);
        ko.applyBindings(g);
    });
</script>

नोट: मैंने अभी इन पंक्तियों को जोड़ा है:

        @Html.HiddenFor(model => model.CourseId, new { data_bind="value: CourseId" })
        @Html.HiddenFor(model => model.CourseName, new { data_bind="value: CourseName" })

क्योंकि जब मैं फॉर्म जमा करता हूं तो मेरे क्षेत्र अक्षम हो जाते हैं, इसलिए मान सर्वर पर प्रेषित नहीं होते थे, इसीलिए मैंने इस ट्रिक को करने के लिए कुछ छिपे हुए फ़ील्ड जोड़े।


हम्म बहुत जानकारीपूर्ण। आपके उत्तर और Pual के उत्तर से मुझे लगता है कि मुझे अपने सभी प्रश्नों का उत्तर मिल गया है सिवाय संपादन योग्य जैसे प्लगइन्स का उपयोग करने के कैसे। उम्मीद है कि किसी को पता है कि मैं इसका उपयोग कैसे कर सकता हूं।
चोबो 2

1
मैंने सिर्फ ko.editablesप्लग-इन के साथ संगतता जोड़ी , आप अद्यतन प्रतिक्रिया की जांच कर सकते हैं या यदि आप चाहें, तो आप इसे चलाने के लिए पूरी परियोजना को स्थानीय रूप से डाउनलोड कर सकते हैं
जुपॉल

जब मैं कर सकता हूं तो मैं इसकी जांच करूंगा। इसे काम करने के लिए कितना बदलना पड़ा? मैं सोच रहा हूं कि अगर मुझे लगता है कि हर प्लगइन के लिए मुझे इसमें बदलाव करना होगा और फिर मुझे अपना संस्करण रखना होगा।
चोबो 2

नहीं। आप आश्चर्यचकित होंगे, यह लगभग आउट ऑफ द बॉक्स है
जुपॉल

1
एक गुच्छा आदमी का धन्यवाद, मैंने आपकी प्रतिक्रिया से कई नई रणनीतियां सीखीं। कुडोस!
आकाश-देव

23

आप अपने ASP.NET MVC दृश्य मॉडल को जावास्क्रिप्ट चर में अनुक्रमित कर सकते हैं:

@model CourseVM
<script type="text/javascript">
    var model = @Html.Raw(Json.Encode(Model));
    // go ahead and use the model javascript variable to bind with ko
</script>

नॉकआउट प्रलेखन में बहुत सारे उदाहरण हैं जिनसे आप गुज़र सकते हैं।


1
हां, मैं उस साइट पर आए इंटरेक्टिव ट्यूटोरियल से गुजरा हूं, लेकिन मैं वास्तव में कभी भी asp.net mvc के साथ कुछ नहीं देखता। मैं देखता हूं कि उनके पास कुछ मैपिंग प्लगइन भी हैं, लेकिन यह सुनिश्चित नहीं है कि यह कैसे फिट बैठता है। आपके उदाहरण में आप इसे नॉकआउट मॉडल (किसी अन्य स्क्रिप्ट में) से कैसे बांधेंगे। मैं वास्तव में संभव के रूप में कम इनलाइन जावास्क्रिप्ट करना चाहता हूं (गैर बेहतर है, लेकिन मुझे लगता है कि संभव नहीं है)
chobo2

2
आप किस समस्या को हल करने की कोशिश कर रहे हैं? यदि आप एमवीसी विचार चाहते हैं और उन्हें उपयोग करने के तरीके से खुश हैं, तो आप वहां पर रह सकते हैं। यदि आप क्लाइंट साइड डेटा बाइंडिंग और हेरफेर चाहते हैं, तो KO एक बढ़िया विकल्प है। आप इस उत्तर के रूप में अपने MVC कोड से अपने KO व्यूमोडेल उत्पन्न कर सकते हैं। यह vm लेता है और इसे json में क्रमबद्ध करता है। फिर क्लाइंट पर आप परिणाम को एक जावास्क्रिप्ट व्यूमॉडल में मैप कर सकते हैं। फिर दृश्यमॉडल को दृश्य से बांधें और आप सभी सेट हैं। गु कुंजी यह है कि MVC और KO को किसी भी तरह से युग्मित नहीं करना है, जब तक कि आप उन्हें नहीं चाहते। यह सब उस समस्या पर निर्भर करता है जिसे आप हल करने की कोशिश कर रहे हैं।
जॉन पापा

1
यह सामान्य है कि आप asp.net mvc के साथ कुछ भी करने के लिए नहीं देख रहे हैं। नॉकआउट क्लाइंट साइड फ्रेमवर्क है। यह नहीं पता है और न ही यह परवाह है कि आप किस सर्वर साइड भाषा का उपयोग कर रहे हैं। उन 2 रूपरेखाओं को पूरी तरह से समाप्त कर दिया जाना चाहिए।
डारिन दिमित्रोव

@ जॉनपापा - मैं जिस तरह से चीजें करता हूं वह मुझे पसंद है लेकिन मुझे नई चीजें सीखना भी पसंद है (मैं देखता हूं कि कुछ स्थितियों में केओ बहुत उपयोगी हो सकता है)। मुझे पता है कि KO क्लाइंट साइड स्क्रिप्ट है, लेकिन मेरे लिए मैं उन्हें एक साथ काम करते हुए देखता हूं। मैं वर्तमान में दृश्य मॉडल और HTML सहायकों का उपयोग करके अपने विचार उत्पन्न करता हूं। इसलिए मेरे दिमाग में KO को इसके साथ मिलकर काम करने की जरूरत है। उदाहरण के लिए, आपको डायलॉग मिला है। आप उन फ़ील्ड में db से मानों को कैसे डिज़ाइन और पॉप्युलेट करेंगे। अगर मैं अपने तरीके का उपयोग कर रहा था तो यह html सहायकों का एक दृश्य होगा जिसमें एक दृश्यमॉडल है। Viewmodel को पॉप्युलेट करेगा और उसे Action Method के माध्यम से भेजेगा और उसका उपयोग करेगा।
चोबो 2

1
@ chobo2, नॉकआउट एक क्लाइंट साइड फ्रेमवर्क है। यह क्लाइंट पर MVC पैटर्न को लागू करने के लिए क्लाइंट पर व्यू मॉडल का उपयोग करता है। सर्वर डिकोड किया गया है। आप उस पर व्यू मॉडल का उपयोग भी कर सकते हैं। यह सिर्फ 2 अलग-अलग जगह है। यदि आपके पास कुछ जटिल तर्क हैं जिन्हें आप जावास्क्रिप्ट का उपयोग करके क्लाइंट पर लागू करना चाहते हैं तो नॉकआउट इसे सरल बना सकता है। अन्यथा, ईमानदारी से, आपको इसकी आवश्यकता नहीं है।
डारिन दिमित्रोव

2

सर्वर मैपिंग के बाद अतिरिक्त गणना किए गए गुणों को प्राप्त करने के लिए आपको क्लाइंट साइड पर अपने व्यूमॉडल को और बढ़ाने की आवश्यकता होगी।

उदाहरण के लिए:

var viewModel = ko.mapping.fromJS(model);

viewModel.capitalizedName = ko.computed(function() {...}, viewModel);

तो हर बार जब आप कच्चे JSON से मैप करते हैं तो आपको गणना किए गए गुणों को फिर से लागू करना होगा।

इसके अतिरिक्त मानचित्रण प्लगइन संवर्द्धित एक viewmodel के रूप में यह आप आगे और पीछे जाना हर बार पुनः बनाने का विरोध किया (में एक अतिरिक्त पैरामीटर का उपयोग अपडेट करने की क्षमता प्रदान करता है fromJS):

// Every time data is received from the server:
ko.mapping.fromJS(data, viewModel);

और जो कि मैप किए गए गुणों के आपके मॉडल के वृद्धिशील डेटा अपडेट को निष्पादित करता है। आप मानचित्रण प्रलेखन में इसके बारे में अधिक पढ़ सकते हैं

आपने डारिन के फ़्लुएंटजन्स पैकेज के उत्तर पर टिप्पणियों में उल्लेख किया है । मैं इसका लेखक हूं, लेकिन इसका उपयोग मामला ko.mapping की तुलना में अधिक विशिष्ट है। मैं आमतौर पर इसका उपयोग केवल तभी करूंगा जब आपका व्यूमॉडल एक ही रास्ता हो (यानी सर्वर -> क्लाइंट) और फिर डेटा को कुछ अलग प्रारूप (या बिल्कुल नहीं) में वापस पोस्ट किया जाता है। या अगर आपके जावास्क्रिप्ट व्यूअमॉडल को आपके सर्वर मॉडल से काफी अलग प्रारूप में होना चाहिए।


हम्म तो मुझे लगता है कि शायद फ़्लुएंटजन्स मेरे लिए नहीं है क्योंकि मेरे व्यूअमॉडल ज्यादातर समय दोनों तरीके से चलते हैं (मैं आमतौर पर इसे वापस भेज देता हूं, हालांकि जोंस के माध्यम से और फिर इसे एक्शन विधि पैरामीटर में व्यूमॉडल से बाँध देता हूं)। क्या आप जानते हैं कि मैं उन प्लगइन्स का उपयोग कैसे कर सकता हूं जिनका मैंने संपादन योग्य जैसा उल्लेख किया है? अंत में क्या मैं मैपिंग का उपयोग करके किसी भी प्रकार की कार्यक्षमता खो रहा हूं और अपने viewmodel बनाम का उपयोग करने की कोशिश नहीं कर रहा हूं?
चोबो 2

मैंने किसी भी प्लगइन्स का उपयोग नहीं किया है इसलिए सुनिश्चित नहीं है। मैंने अतीत में जो कुछ किया है वह सिर्फ हर बदलाव के लिए सदस्यता लेने और सीरियलाइज्ड व्यूमोडेल के ढेर को रखने के लिए है जिसमें कहा गया है कि मैं पूर्ववत ( इस प्रश्न को देखें ) बदलाव और पॉप पर जोर दूंगा ।
पॉल टायनग जूल

मैपिंग आपको किसी भी कार्यक्षमता से दूर नहीं रखती है, आपको बस यह सुनिश्चित करने और इसके सम्मेलनों का निरीक्षण करने की आवश्यकता है कि यह मैपिंग को जेएस से कैसे और कैसे संभालता है, यह सब एक साथ खेलने के लिए।
पॉल टायनग जूल

अच्छी तरह से आपके द्वारा पोस्ट किए गए प्रश्न का स्वीकृत उत्तर मूल रूप से प्लगइन क्या होगा। यह वही है जो मुझे भ्रमित कर रहा है जैसा कि आप देख सकते हैं कि वे एक दृश्यदर्शी बना सकते हैं और फिर उनके द्वारा बनाए गए फ़ंक्शन का उपयोग कर सकते हैं (ko.observableArrayWithUndo ([]))। अगर मैं मैपिंग कर रहा हूं तो मुझे नहीं पता कि ऐसा कैसे करना है। दिमाग में केवल यह बात आती है कि अपनी खुद की मैपिंग लिखो (मुझे क्या संदेह है कि मैं इस समय सही हो सकता हूं) जिसमें प्रत्येक संपत्ति को पूर्ववत या मानचित्रित किया गया है, लेकिन फिर मैं मूल रूप से सर्वर के लिए एक और ग्राहक के लिए एक और एक के लिए एक दृश्यदर्शी की नकल करता हूं डरा हुआ कि
अचूक

आह, मुझे खेद है कि मैं उस प्रश्न के उत्तर के बारे में बात कर रहा था, क्षमा करना सीधे जुड़ा होना चाहिए।
पॉल टाइनग जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.