Karunia
Sudah beberapa saat dan saya masih memiliki beberapa pertanyaan luar biasa. Saya berharap dengan menambahkan hadiah mungkin pertanyaan-pertanyaan ini akan dijawab.
- Bagaimana Anda menggunakan html helpers dengan knockout.js
Mengapa dokumen siap diperlukan untuk membuatnya berfungsi (lihat edit pertama untuk informasi lebih lanjut)
Bagaimana saya melakukan sesuatu seperti ini jika saya menggunakan pemetaan sistem gugur dengan model tampilan saya? Karena saya tidak memiliki fungsi karena pemetaan.
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 };
Saya ingin menggunakan plugin misalnya saya ingin dapat mengembalikan yang dapat diamati seolah-olah pengguna membatalkan permintaan saya ingin dapat kembali ke nilai terakhir. Dari penelitian saya ini tampaknya dapat dicapai oleh orang yang membuat plugin seperti yang dapat diedit
Bagaimana saya menggunakan sesuatu seperti itu jika saya menggunakan pemetaan? Saya benar-benar tidak ingin pergi ke metode di mana saya miliki dalam pemetaan manual tampilan saya adalah saya memetakan setiap bidang viewMode MVC ke bidang model KO karena saya ingin sesedikit mungkin javascript sebaris mungkin dan yang sepertinya menggandakan pekerjaan dan itu mengapa saya suka pemetaan itu.
Saya khawatir untuk membuat pekerjaan ini mudah (dengan menggunakan pemetaan) saya akan kehilangan banyak daya KO tetapi di sisi lain saya khawatir bahwa pemetaan manual hanya akan banyak pekerjaan dan akan membuat pandangan saya mengandung terlalu banyak informasi dan mungkin menjadi lebih sulit di masa depan untuk mempertahankan (katakanlah jika saya menghapus properti dalam model MVC saya harus memindahkannya juga di model tampilan KO)
Pos Asli
Saya menggunakan asp.net mvc 3 dan saya melihat ke sistem gugur karena terlihat cukup keren tapi saya mengalami kesulitan mencari tahu cara kerjanya dengan asp.net mvc terutama melihat model.
Bagi saya sekarang saya melakukan sesuatu seperti ini
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; }
}
Saya akan memiliki Vm yang memiliki beberapa properti dasar seperti CourseName dan akan memiliki beberapa validasi sederhana di atasnya. Model Vm mungkin berisi model tampilan lain di dalamnya juga jika diperlukan.
Saya kemudian akan meneruskan Vm ini ke Tampilan jika saya akan menggunakan html helpers untuk membantu saya menampilkannya kepada pengguna.
@Html.TextBoxFor(x => x.CourseName)
Saya mungkin memiliki beberapa loop foreach atau sesuatu untuk mendapatkan data dari koleksi Model Student View.
Lalu ketika saya akan mengirimkan formulir saya akan menggunakan jquery dan serialize array
dan mengirimkannya ke metode tindakan pengontrol yang akan mengikatnya kembali ke model view.
Dengan knockout.js semuanya berbeda karena Anda sekarang punya viewmodels untuk itu dan dari semua contoh yang saya lihat mereka tidak menggunakan html helpers.
Bagaimana Anda menggunakan 2 fitur MVC ini dengan knockout.js?
Saya menemukan video ini dan secara singkat (beberapa menit terakhir dari video @ 18:48) masuk ke cara untuk menggunakan viewmodels dengan pada dasarnya memiliki skrip inline yang memiliki viewmodel knockout.js yang mendapatkan nilai-nilai dalam ViewModel.
Apakah ini satu-satunya cara untuk melakukannya? Bagaimana kalau dalam contoh saya dengan memiliki koleksi viewmodels di dalamnya? Apakah saya harus memiliki loop foreach atau sesuatu untuk mengekstrak semua nilai keluar dan menetapkannya ke sistem gugur?
Adapun pembantu html video tidak mengatakan apa-apa tentang mereka.
Ini adalah 2 area yang membingungkan saya karena tidak banyak orang yang membicarakannya dan membuat saya bingung bagaimana nilai awal dan semuanya terlihat saat contoh hanya beberapa contoh nilai hard-coded.
Edit
Saya mencoba apa yang disarankan Darin Dimitrov dan ini tampaknya berhasil (saya harus membuat beberapa perubahan pada kodenya). Tidak yakin mengapa saya harus menggunakan dokumen siap tetapi entah bagaimana semuanya tidak siap tanpanya.
@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>
Saya harus membungkusnya di sekitar dokumen jquery yang siap untuk membuatnya berfungsi.
Saya juga mendapat peringatan ini. Tidak yakin tentang apa semua ini.
Warning 1 Conditional compilation is turned off -> @Html.Raw
Jadi saya punya titik awal, saya kira setidaknya akan memperbarui ketika saya melakukan lebih banyak bermain-main dan bagaimana ini bekerja.
Saya mencoba melalui tutorial interaktif tetapi menggunakan ViewModel sebagai gantinya.
Belum yakin bagaimana cara mengatasi bagian-bagian ini
function AppViewModel() {
this.firstName = ko.observable("Bert");
this.lastName = ko.observable("Bertington");
}
atau
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
};
Edit 2
Saya sudah bisa mencari tahu masalah pertama. Tidak ada petunjuk tentang masalah kedua. Namun demikian. Ada yang punya ide?
@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>
Pengendali
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);
}
Jawaban:
Saya pikir saya telah merangkum semua pertanyaan Anda, jika saya melewatkan sesuatu tolong beri tahu saya ( Jika Anda bisa meringkas semua pertanyaan Anda di satu tempat akan menyenangkan =))
Catatan. Kompatibilitas dengan
ko.editable
plug-in ditambahkanUnduh kode lengkap
Bagaimana Anda menggunakan html helpers dengan knockout.js
Ini mudah:
Dimana:
value: CourseId
menunjukkan bahwa Anda mengikatvalue
propertiinput
kontrol denganCourseId
properti dari model dan model skrip AndaHasilnya adalah:
Mengapa dokumen siap diperlukan untuk membuatnya berfungsi (lihat edit pertama untuk informasi lebih lanjut)
Saya belum mengerti mengapa Anda perlu menggunakan
ready
acara tersebut untuk membuat serial model, tetapi tampaknya itu hanya diperlukan (meskipun tidak perlu khawatir tentang hal itu)Bagaimana saya melakukan sesuatu seperti ini jika saya menggunakan pemetaan sistem gugur dengan model tampilan saya? Karena saya tidak memiliki fungsi karena pemetaan.
Jika saya mengerti dengan benar Anda perlu menambahkan metode baru ke model KO, yah itu model penggabungan yang mudah
Untuk info lebih lanjut, di bagian -Petakan dari berbagai sumber-
Tentang peringatan yang Anda terima
Anda perlu menggunakan kutipan
Kompatibilitas dengan plug-in ko.editable
Saya pikir itu akan menjadi lebih kompleks, tetapi ternyata integrasi sangat mudah, untuk membuat model Anda dapat diedit, tambahkan saja baris berikut: (ingat bahwa dalam hal ini saya menggunakan model campuran, dari server dan menambahkan ekstensi di klien dan dapat diedit hanya berfungsi ... hebat):
Dari sini Anda hanya perlu bermain dengan binding menggunakan ekstensi yang ditambahkan oleh plug-in, misalnya, saya memiliki tombol untuk mulai mengedit bidang saya seperti ini dan pada tombol ini saya memulai proses edit:
Kemudian saya telah melakukan dan membatalkan tombol dengan kode berikut:
Dan akhirnya, saya memiliki satu bidang untuk menunjukkan apakah bidang dalam mode edit atau tidak, ini hanya untuk mengikat properti yang diaktifkan.
Tentang pertanyaan array Anda
Anda dapat melakukan hal yang sama dengan KO, dalam contoh berikut, saya akan membuat output berikut:
Pada dasarnya di sini, Anda memiliki dua daftar, dibuat menggunakan
Helpers
dan diikat dengan KO, mereka memilikidblClick
acara yang diikat ketika dipecat, menghapus item yang dipilih dari daftar saat ini dan menambahkannya ke daftar lain, ketika Anda memposting keController
, konten masing-masing daftar dikirim sebagai data JSON dan dilampirkan kembali ke model serverNugget:
Skrip eksternal .
Kode pengontrol
Model
Halaman CSHTML
Skrip
Catatan: Saya baru saja menambahkan baris ini:
Karena ketika saya mengirimkan formulir, bidang saya dinonaktifkan, sehingga nilai tidak dikirim ke server, itu sebabnya saya menambahkan beberapa bidang tersembunyi untuk melakukan trik
sumber
ko.editables
plug-in, Anda dapat memeriksa respons yang diperbarui atau jika Anda mau, Anda dapat mengunduh seluruh proyek untuk menjalankannya secara lokalAnda bisa membuat serial model ASP.NET MVC Anda menjadi variabel javascript:
Ada banyak contoh dalam dokumentasi KO yang bisa Anda lalui.
sumber
Untuk mencapai properti yang dihitung tambahan setelah pemetaan server, Anda perlu lebih meningkatkan model tampilan Anda di sisi klien.
Sebagai contoh:
Jadi, setiap kali Anda memetakan dari JSON mentah, Anda harus menerapkan kembali properti yang dihitung.
Selain itu, plugin pemetaan menyediakan kemampuan untuk memperbarui model tampilan secara bertahap daripada membuatnya kembali setiap kali Anda bolak-balik (gunakan parameter tambahan di
fromJS
):Dan itu mengeksekusi pembaruan data tambahan pada model Anda hanya properti yang dipetakan. Anda dapat membaca lebih lanjut tentang itu di dokumentasi pemetaan
Anda menyebutkan dalam komentar tentang jawaban Darwin paket FluentJSON . Saya penulisnya, tetapi use case-nya lebih spesifik daripada pemetaan ko. Saya biasanya hanya akan menggunakannya jika viewmodels Anda satu arah (mis. Server -> client) dan kemudian data diposting kembali dalam beberapa format yang berbeda (atau tidak sama sekali). Atau jika model tampilan javascript Anda harus dalam format yang jauh berbeda dari model server Anda.
sumber