고객 주문 및 많은 주문 항목을 모델링하는 KnockoutJS 뷰 모델을 만들려고합니다. 초기 데이터를로드하고 데이터의 유효성을 검사하려고합니다.관찰 가능한 배열을 사용한 Knockoutjs 매핑 및 유효화
지금까지 knockoutjs.mapping을 사용하여 데이터를로드 할 수 있었지만 매핑을 사용하여 추가 된 데이터의 유효성을 검사했습니다.
// data to load into viewmodel
var modeldata = {
"OrderID":1,
"ReturnString":null,
"CustomerName":"First Customer",
"OrderDate":"2013-09-16T19:41:40.1639709+01:00",
"OrderItems": [
{"ItemID":0,
"ItemName":"Name_0",
"ItemPrice":0.0,
"_destroy":false
},
{"ItemID":1,
"ItemName":"Name_1",
"ItemPrice":10.0,
"_destroy":false
},
{"ItemID":2,
"ItemName":"Name_2",
"ItemPrice":20.0,
"_destroy":false
}
]
};
// setup defaults for validation
var validationOptions = {
insertMessages: true,
decorateElement: true,
errorElementClass: 'errorCSS',
messagesOnModified: true,
debug: true,
grouping: {
deep: true,
observable: false //Needed so added objects AFTER the initial setup get included
},
};
ko.validation.init(validationOptions);
// define array model
var Item = function() {
var self = this;
ItemID = ko.observable();
ItemName = ko.observable().extend({
required: { message: '* item name needed' }
});
ItemPrice = ko.observable();
_destroy = false;
}
// define view model
var ViewModel = function (data) {
var self = this;
self.OrderID = ko.observable();
self.ReturnString = ko.observable();
self.CustomerName = ko.observable().extend({
required: { message: '* customer name needed' }
});
self.OrderDate = ko.observable();
self.OrderItems = ko.observableArray([]); // to be array of "Item"
// create validation group
self.orderErrors = ko.validation.group(self);
self.orderItemErrors = ko.validation.group(
self.OrderItems, { deep: true }
);
self.lineItemsValid = function() {
var LValid = false;
if (self.orderItemErrors().length > 0) {
if (self.orderItemErrors()[0] != null) // important to test for null
LValid = false;
else
LValid = true;
}
else LValid = true
if (LValid) {
return true
}
else
{
self.orderItemErrors.showAllMessages();
return false;
}
}
self.orderValid = function() {
var LValid = false;
if (self.orderErrors().length > 0) {
if (self.orderErrors()[0] != null) // important to test for null
LValid = false;
else
LValid = true;
}
else LValid = true
if (LValid) {
return true
}
else {
self.orderErrors.showAllMessages();
return false;
}
}
self.isValid = function() {
if(self.orderValid() & self.lineItemsValid()){
alert('All ok!')
}
else{
alert('Errors!');}
}
// operations
self.addLineItem = function() {
self.OrderItems.unshift(new Item());
}
self.removeLineItem = function (item) {
self.OrderItems.destroy(item);
}
// load data into model
self.loadData = function() {
ko.mapping.fromJS(modeldata, {}, self);
}
}
$(document).ready(function() {
var viewModel = new ViewModel()
ko.applyBindings(viewModel);
});
문제 :
(1) 나는 또한 클릭 기능을 사용하여 주문 항목, 그러나이의 데이터가 관측 배열에 업데이 트하지 않는 것을 추가 할 수 있습니다. 그러나 "항목 제거"함수를 호출하면 배열 항목이 삭제됨으로 표시됩니다.
(2)가 매핑 항목을로드하고, 확인을 테스트 할 때, 그것은 지도를 통해로드 된 항목 내가 매핑 후 추가하지 주문 - 항목 만이 완료 작업 (= TRUE 필수)
(3) 매핑으로 가져온 주문 항목을 업데이트하면 변경 사항이 관찰 가능한 배열에 즉시 반영됩니다. 매핑 후에 추가 한 주문 항목을 업데이트하면 배열에 업데이트가 없습니다.
내가 여기 JSFiddle 있습니다http://jsfiddle.net/devops/ZsDjh/40/
나는 내가 관찰 배열에 추가하고 어떻게 함께 할 수있는 뭔가하지만 분명 아무것도 볼 수 없습니다 확신 - 나는 분명히 기본적인 뭔가를 놓친 거지 .. 누구든지 아이디어가 있다면?
감사합니다.
안녕하세요 로저 - 정말 고마워요, 바퀴가 기름을! ... 대단히 감사합니다. – qtime67