2013-05-11 4 views
1

Я пытаюсь создать директиву captcha с использованием плагина jquery http://keith-wood.name/realPerson.html.Привязка сгенерированного jquery скрытого поля к модели angularjs в директиве

Я относительно новичок в angularjs и не могу найти способ сделать это. В принципе, я хочу, чтобы captcha проверял, что человек подписывается для своей учетной записи. Вызов element.realperson() будет генерировать скрытое поле ввода с некоторым хешированным значением, которое мне нужно сравнить с введенным вводом на сервере.

Так что, если я назову эту основную и неполную директиву, она привяжет модель newUser.captchaInput к форме ввода, но я не могу на всю жизнь понять, как захватить значение скрытого поля $ (' #captcha_hash '). val() и каким-то образом включить его в данные формы. В идеале, как newUser.captchaHash.

angular.module('vah').directive("captcha", -> 
    restrict: "A" 
    require: '?ngModel' 
    link: (scope, element, attrs, ngModel) -> 
    return if !ngModel 

    optionsObj = { 
     length: 5 
    } 

    element.realperson(optionsObj) 

    # need to bind $('#captcha_hash').val() to a newUser.captchaHash model, or 
    add the model to that generated input field. 

) 

<input captcha id="defaultReal" ng-model="newUser.captchaInput"> 

Я уверен, что для этого есть простое решение, и будет признательна за любую помощь.

ответ

0

Рабочий код, благодаря некоторой помощи от кого-то на другом форуме программирования. Это определенно не идеально, и я многому научился, но это работает.

angular.module('vah').directive("captcha", ($timeout, $parse) -> 
    restrict: "A" 
    require: '?ngModel' 
    link: (scope, element, attrs, ngModel) -> 
    return if !ngModel 

    optionsObj = { 
     length: 5 
    } 

    $timeout(-> 
     attrs.foo = $('#captcha_hash') 
     hashSet = $parse(attrs.ngModel).assign 
     scope.$watch(attrs.foo.val(), (newVal) -> 
     hashSet(scope, newVal) 
    ) 
    , 300) 
    element.realperson(optionsObj) 

) 

Кроме того, я буду включать код рубинового для хеширования этого конкретного искаженным, так как я столкнулся с проблемами с Bignum и рубином по сравнению с тем, как это сделано в JavaScript, или их примеры PHP/Java.

module CaptchaHashing 
    module ClassMethods 
    def rp_hash(value) 
     hash_value = 5381 
     value = value.upcase 
     value.chars.each do |c| 
     hash_value = ((left_shift_32(hash_value, 5)) + hash_value) + c.ord 
     puts hash_value 
     end 
     hash_value 
    end 

    def left_shift_32 x, shift_amount 
     shift_amount &= 0x1F 
     x <<= shift_amount 
     x &= 0xFFFFFFFF 

     if (x & (1<<31)).zero? 
     x 
     else 
     x - 2**32 
     end 
    end 

    end 

    def self.included(receiver) 
    receiver.extend ClassMethods 
    end 
end 

и

def self.valid_captcha?(captcha_hash, captcha_input) 
    if captcha_hash.present? && captcha_input.present? 
     rp_hash(captcha_input) == captcha_hash 
    else 
     false 
    end 
    end 

Удачи!

1

Если вам понравилась reCaptcha, вы можете использовать VividCortex/angular-recaptcha.

+0

Случайный downvote, извините! –

+0

Это нормально @MichaelRobinson. Вы можете отменить его, щелкнув стрелку еще раз :) –

+0

Голосование заперто, если не отредактирован ответ (спасибо за отзыв, хотя: P) –

Смежные вопросы