はじめに
http://blogs.yahoo.co.jp/dk521123/35963034.htmlのつづき。 今回は、変更した後に変更部分を元に戻した場合、変更していないと判断してくれるように作る
サンプル
* 以下の関連記事を元にしている。ビュー以外のモデル、コントローラについては以下を参照。http://blogs.yahoo.co.jp/dk521123/35956746.html
* ASP.NET MVC + knockout.jsだと大抵ではajaxを使ったサンプルが多いが、 今回のサンプルでは、(実験的な意味で)ajaxを使わずに、 サーバとのやり取りを一回だけにしたサンプルにしてみた # ソースの作り的にはajaxを使った方が綺麗にコーディングできる
■knockout.js利用版
* 以下の関連記事で取り扱った knockout.js を利用する。http://blogs.yahoo.co.jp/dk521123/35949660.html
外部JabaScript:/Scripts/ChangeValuesTracker.js
function ChangeTracker(root, isInitiallyDirty) {
var result = function() {}
var initialState = ko.observable(ko.toJSON(root));
var isInitiallyDirty = ko.observable(isInitiallyDirty);
result.isDirty = ko.dependentObservable(function() {
return isInitiallyDirty() || initialState() !== ko.toJSON(root);
});
result.reset = function() {
initialState(ko.toJSON(root));
isInitiallyDirty(false);
};
return result;
};
function setViewModelToCheckChagingValues(viewModel) {
viewModel.tracker = new ChangeTracker(viewModel, false);
viewModel.move = function() {
if (viewModel.tracker.isDirty()) {
return window.confirm('You have some changes.\nAre you sure you want to go to the other pages?');
}
return true;
}
ko.applyBindings(viewModel);
}
function parseBoolean(targetValue) {
if (!targetValue) {
return false;
}
return (targetValue.toLowerCase()) == "true";
}
ビュー:Index.vbhtml @ModelType WebAppli.Models.EmployeeListModel
@Code
ViewData("Title") = "Index"
Dim index As Integer = 0
End Code
@Using (Html.BeginForm("SendResult", "SampleMvc", FormMethod.Post, New With {.Id = "formID"}))
@<table>
<thead>
<tr>
<th>Delete?</th>
<th>ID</th>
<th>Name</th>
</tr>
</thead>
<tbody data-bind="foreach: employees">
<tr>
<td><input type="checkbox"
data-bind="checked: isChecked, attr: { value: isChecked, name: 'Employees[' + $index() + '].IsChecked' }" /></td>
<td><input type="text"
data-bind="value: employeeId, attr: { name: 'Employees[' + $index() + '].EmployeeId' }" /></td>
<td><input type="text"
data-bind="value: employeeName, attr: { name: 'Employees[' + $index() + '].EmployeeName' }" /></td>
</tr>
</tbody>
</table>
@<input type="submit" value="Send" />
@<a href="http://www.yahoo.co.jp/" data-bind="click: move">Go yahoo!</a>
End Using
<script src="@Url.Content("~/Scripts/knockout-3.4.0.debug.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/ChangeValuesTracker.js")" type="text/javascript"></script>
<script type="text/javascript">
function Employee(isChecked, id, name) {
this.isChecked = ko.observable(parseBoolean(isChecked));
this.employeeId = ko.observable(id);
this.employeeName = ko.observable(name);
}
function ViewModel(models) {
this.employees = ko.observableArray(models);
}
var models = [];
@Code
For Each employee In Model.Employees
@<text>
var model = new Employee('@employee.IsChecked', '@employee.EmployeeId', '@employee.EmployeeName');
models.push(model);
</text>
Next
End Code
setViewModelToCheckChagingValues(new ViewModel(models));
</script>
knockout.jsを使用すると、HTMLヘルパーって使わないなーってことで、以下の関連記事で、HTMLヘルパーを使ったパターンを考える
http://blogs.yahoo.co.jp/dk521123/35967929.html
http://blogs.yahoo.co.jp/dk521123/35967929.html