基本的に、サイトでのフォーム検証にノックアウト js を使用しています。
問題は、動的データをajaxでロードするのではなく、ページ内で送信することを好むことです(すでにhtmlでデータを送信できる場合、追加のリクエストを行う意味はありません)。
問題は、サーバーから送信されたページのコンテンツを「リバース エンジニアリング」して、ノックアウト js モデルに入力する必要があることです。私はこのようにしています(モデルはユーザーであり、ページ上のすべてのユーザーを含むhtmlテーブルがあります):
// Handler to prepopulate my viewmodel (list of users) with data from the page
ko.bindingHandlers.populateUsersFromTable = {
init:function (element, valueAcessor, allBindingsAccessor, viewModel) {
var collection = valueAcessor(),
tableRows = $(element).find("tbody > tr"),
numberOfRows = tableRows.length,
tableCells,
user,
i;
for (i = 0; i < numberOfRows; i++) {
tableCells = $(tableRows[i]).children("td");
user = new User({
name:$(tableCells).find(".user-name").text(),
email:$(tableCells).find(".user-email").text(),
clt_pj:$(tableCells).find(".user-clt_pj").text(),
admin:$(tableCells).find(".user-admin").text(),
blacklisted:$(tableCells).find(".user-blacklisted").text(),
fired:$(tableCells).find(".user-fired").text()
});
collection.push(user);
}
}
}
// User Model/ViewModel
function User(u) {
var self = this;
// data
self.name = ko.observable(u.name || '');
self.email = ko.observable(u.email || '');
self.clt_pj = ko.observable(u.clt_pj || '');
self.admin = ko.observable(u.admin || false);
self.blacklisted = ko.observable(u.blacklisted || false);
self.fired = ko.observable(u.fired || false);
// view
self.selected = ko.observable(false);
}
動作しますが、コードが UI に依存しているため、良い解決策とは思えません。
これを行うためのより良いアプローチは何でしょうか?