Проверить поле в observablearray не работает (используя плагин проверки нокаута)

Я использую подключаемый модуль проверки нокаута и пытаюсь сравнить поле даты в наблюдаемом массиве со статической датой. Я знаю, что код неполный, но вот что у меня есть:

РЕДАКТИРОВАТЬ: ПРОСМОТРЕТЬ КОД-

                                         <tbody data-bind="foreach: allCertificates">
                                        <tr id="AllCertRow" style="cursor: pointer" data-bind="click: $parent.selectThing, css: { highlight: $parent.isSelected() == $data.lwCertID }">
                                            <td>
                                                <ul >

                                                   <li><H5><b><span data-bind="    text: clientName"></span>&nbsp;(<span data-bind="    text: clientNumber"></span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span data-bind="    text: borrowBaseCount"></span>&nbsp;Loan(s)&nbsp;</b></H5></li>
                                                    Collateral Analyst:&nbsp;<span data-bind="    text: userName"></span>
                                                    <br />
                                                Certificate:&nbsp;<span data-bind="text: lwCertID"></span>&nbsp;&nbsp;Request&nbsp;Date:&nbsp;<span data-bind="    text: moment(requestDate).format('DD/MMM/YYYY')"></span>
                                                    </ul>
                                            </td>
                                        </tr>
                                    </tbody>

Мой код модели просмотра-

         var LucasSystemDate = ko.observableArray('4/22/2013');
     var allCertificates = ko.observableArray([]);

        ko.validation.configure({
        registerExtenders: true,
        messagesOnModified: true,
        insertMessages: true,
        parseInputAttributes: true,
        messageTemplate: null,
        grouping: {
            deep: true
        }
    });

        ko.validation.rules['Expired'] = {
        validator: function (val, otherVal) {
            return val < otherVal;
        },
        message: 'Request has expired. Please reject and initiate client contact.'
    };

    var activate = function () {
        // go get local data, if we have it
        return true;
    };


    var vm = {
        activate: activate,
        LucasSystemDate: LucasSystemDate,
    allCertificates: allCertificates[
        { lwCertID: '2', clientID: '1EX', requestDate: '7/3/2013 12:34:00 PM', userName: 'Peter Rabbit', statusDescription:     'Submitted', statusCode: '1', statusDesc: 'Submitted', clientName: 'Test Company 1                     ', clientNumber: '1EX',  borrowBaseCount: '1', advRequestCount: '1', ceoUserName: 'Woodall, Chris' },
{ lwCertID: '5', clientID: '1EX  ', requestDate: '7/3/2013 1:00:00 PM', userName: 'Bugs Bunny', statusDescription: 'Submitted',     statusCode: '1', statusDesc: 'Submitted', clientName: 'Test Company 2                     ', clientNumber: '1EX',   borrowBaseCount: '1', advRequestCount: '1', ceoUserName: 'Woodall, Chris' },
{ lwCertID: '6', clientID: '1EX  ', requestDate: '7/8/2013 6:31:00 AM', userName: 'Jack Frost', statusDescription: 'Submitted',     statusCode: '1', statusDesc: 'Submitted', clientName: 'Test Company 3                     ', clientNumber: '1EX',   borrowBaseCount: '1', advRequestCount: '1', ceoUserName: 'Woodall, Chris' }
    ]
}

//NOT SURE HOW TO COMPARE requestDate IN THE allCertificates OBSERVEABLEARRAY TO 
//THE LucasSystemDate.  IF LucasSystemDate < allCertificates.requestDate
//THEN FAIL VALIDATION AND DISPLAY ERROR MESSAGE.  THIS CHECK SHOULD 
//BE PERFORMED EACH TIME THE DATA IS INITIALLY LOADED.

Под закомментированным кодом в нижней части приведенного выше кода, какой код я бы поместил здесь, чтобы использовать правило проверки Expired для сравнения requestDate в наблюдаемом массиве allCertificates с LucasSystemDate?


person Chris    schedule 01.08.2013    source источник


Ответы (1)


Первая проблема заключается в том, что наша дата не является массивом, это просто значение даты, поэтому исправьте это, и вы сможете сравнить ее с чем угодно:

var LucasSystemDate = ko.observableArray('4/22/2013');

должно быть

var LucasSystemDate = ko.observable('4/22/2013');

Это должен быть пример того, как создать правило, а затем применить его к чему-либо, но я не могу быть на 100% уверен, что это скомпилируется и запустится так, как вы хотите. Возможно, вам придется настроить его.

// Create a new rule called expired
ko.validation.rules['expired'] = {
    validator: function (val, otherVal) {
        // val appears to be the value of the observable, otherVal appears to be the value you set the rule equal to
        return val < otherVal;
    },
    message: 'Request has expired. Please reject and initiate client contact.'
};
// It looks like you need to register these extensions
ko.validation.registerExtenders();

// No sense in making the date either observable nor an observable array, as you won't be using it in the DOM
var LucasSystemDate = new Date('4/22/2013');

var allCertificates = ko.observableArray();

// This doesn't need to be observable but to save time I made it an observable array so I could use the arrayForEach util
var certsArray = ko.observableArray([
{ lwCertID: '2', clientID: '1EX', requestDate: '7/3/2013 12:34:00 PM', userName: 'Peter Rabbit', statusDescription:     'Submitted', statusCode: '1', statusDesc: 'Submitted', clientName: 'Test Company 1                     ', clientNumber: '1EX',  borrowBaseCount: '1', advRequestCount: '1', ceoUserName: 'Woodall, Chris' },
{ lwCertID: '5', clientID: '1EX  ', requestDate: '7/3/2013 1:00:00 PM', userName: 'Bugs Bunny', statusDescription: 'Submitted',     statusCode: '1', statusDesc: 'Submitted', clientName: 'Test Company 2                     ', clientNumber: '1EX',   borrowBaseCount: '1', advRequestCount: '1', ceoUserName: 'Woodall, Chris' },
{ lwCertID: '6', clientID: '1EX  ', requestDate: '7/8/2013 6:31:00 AM', userName: 'Jack Frost', statusDescription: 'Submitted',     statusCode: '1', statusDesc: 'Submitted', clientName: 'Test Company 3                     ', clientNumber: '1EX',   borrowBaseCount: '1', advRequestCount: '1', ceoUserName: 'Woodall, Chris' }]);

// Iterate through the array, extend with the validator, and push the cert into the all certs observable array
ko.utils.arrayForEach(certsArray(), function (cert) {
    cert.extend({ expired: LucasSystemDate });
    allCertificates.push(cert);
});

// Expose the functions / observables to the DOM
var vm = {
    activate: activate,
    LucasSystemDate: LucasSystemDate,
    allCertificates: allCertificates
};

// Apply your bindings, you may not need to do this if you are using a framework which binds for you
ko.applyBindings(new vm());
person PW Kad    schedule 01.08.2013
comment
Спасибо ПВ. Я новичок в проверке нокаута. Можешь дать мне еще немного? Возможно, голый пример костей. Не уверен, куда пойдет ваш оператор ko.utils.arrayForEach. Логика отклонения будет просто печатать «Срок действия запроса истек» в списке в представлении (я добавил код представления в свой пост). Как бы это выглядело? - person Chris; 01.08.2013
comment
С концепцией Knockout-валидации можно ознакомиться по этой ссылке — github.com/ericmbarnard/Knockout-Validation - но в основном вы расширяете наблюдаемое. Я настоятельно рекомендую вам внести коррективы, о которых я упоминал выше, и изучить ссылку, так как вы поймете, как использовать нокаутную проверку, и вам не придется возвращаться сюда, чтобы попросить дополнительную помощь в следующий раз, когда вы ее используете :) - person PW Kad; 01.08.2013
comment
Я изучал это. Вот откуда я получил ko.validation.rules в своем коде. Чего мне не дают, так это деталей. Как все это сочетается. - person Chris; 01.08.2013
comment
Он показывает мне пользовательское правило, но что мне с ним делать? Это как если бы вас попросили приготовить конкретное блюдо, а дали бы только сахар. Понятия не имею, какие еще ингредиенты, поэтому я понятия не имею, какое блюдо меня просят приготовить. - person Chris; 01.08.2013
comment
Посмотрите раздел «Начало работы». Когда вы создаете наблюдаемую, вы расширяете ее свойствами проверки. Это довольно просто, я добавлю немного дополнительной логики в свой ответ. - person PW Kad; 01.08.2013
comment
Хорошо, я добавил образец, основанный на их веб-сайте, который МОЖЕТ делать то, что вы ищете, или может нуждаться в некоторой настройке. Если вы не понимаете, что такое наблюдаемые или что такое массивы, вам, вероятно, нужно еще немного изучить, прежде чем использовать технологию, потому что очень важно понимать, что вы делаете. - person PW Kad; 01.08.2013