0
<script>
    $(document).ready(function () {

        var lnkAgreement = $('#lnk-agreement');
        if ($('#IsConsultant').attr('checked')) {
            lnkAgreement.attr('href', '@Url.Action("ServiceProviderAgreement", "Home")');
            lnkAgreement.text('service provider agreement');
        }
        else {
            lnkAgreement.attr('href', '@Url.Action("UserAgreement","Home")');
            lnkAgreement.text('user agreement');
        }
        $('#IsConsultant').click(function () {

            if ($('#IsConsultant').attr('checked')) {
                lnkAgreement.attr('href', '@Url.Action("ServiceProviderAgreement", "Home")');
                lnkAgreement.text('service provider agreement');
            }
            else {
                lnkAgreement.attr('href', '@Url.Action("UserAgreement","Home")');
                lnkAgreement.text('user agreement');
            }

        });
    });
</script>
<a href="#" id="lnk-agreement"></a>

How to avoid from iterative blocks of the code?

Alexandre
  • 13,030
  • 35
  • 114
  • 173

7 Answers7

1

Make a function for it:

function Test(){
     if ($('#IsConsultant').attr('checked')) {
          lnkAgreement.attr('href', '@Url.Action("ServiceProviderAgreement", "Home")');
          lnkAgreement.text('service provider agreement');
     }
     else {
          lnkAgreement.attr('href', '@Url.Action("UserAgreement","Home")');
          lnkAgreement.text('user agreement');
    }
 }
gdoron
  • 147,333
  • 58
  • 291
  • 367
JoJa
  • 612
  • 5
  • 8
1

Put it all in a function.

function myFunction() {
    if ($('#IsConsultant').attr('checked')) {
        lnkAgreement.attr('href', '@Url.Action("ServiceProviderAgreement", "Home")');
        lnkAgreement.text('service provider agreement');
    }
    else {
        lnkAgreement.attr('href', '@Url.Action("UserAgreement","Home")');
        lnkAgreement.text('user agreement');
    }
}

Then call that function on document ready and on the click.

$('#IsConsultant').click(myFunction);
Filip
  • 2,514
  • 17
  • 28
1
function myMethod(){
if ($('#IsConsultant').attr('checked')) {
            lnkAgreement.attr('href', '@Url.Action("ServiceProviderAgreement", "Home")');
            lnkAgreement.text('service provider agreement');
        }
        else {
            lnkAgreement.attr('href', '@Url.Action("UserAgreement","Home")');
            lnkAgreement.text('user agreement');
        }

}

myMethod();

$('#IsConsultant').click(function () {
 myMethod();
}
dku.rajkumar
  • 18,414
  • 7
  • 41
  • 58
1

A very quick refactoring gave me this:

<script>
$(document).ready(function () {

    // select the dom elements
    var lnkAgreement = $('#lnk-agreement');
    var isConsultant = $('#IsConsultant');


    setLnkAgreement(isConsultant.attr('checked'));

    isConsultant.click(function () {
        setLnkAgreement(isConsultant.attr('checked')
    });
});

function setLnkAgreement(isConsultant){
    if (isConsultant) {
        lnkAgreement.attr('href', '@Url.Action("ServiceProviderAgreement", "Home")');
        lnkAgreement.text('service provider agreement');
    }
    else {
        lnkAgreement.attr('href', '@Url.Action("UserAgreement","Home")');
        lnkAgreement.text('user agreement');
    }
}

You need to move your common functionality into a function of its own and then clal that with the required parameters.

Regards,

James

james lewis
  • 2,486
  • 3
  • 24
  • 30
0

This?

$(document)
.ready(function () {
var a = $("#lnk-agreement");
$("#IsConsultant")
    .attr("checked") ? (a.attr("href", '@Url.Action("ServiceProviderAgreement", "Home")'), a.text("service provider agreement")) : (a.attr("href", '@Url.Action("UserAgreement","Home")'), a.text("user agreement")), $("#IsConsultant")
    .click(function () {
    $("#IsConsultant")
        .attr("checked") ? (a.attr("href", '@Url.Action("ServiceProviderAgreement", "Home")'), a.text("service provider agreement")) : (a.attr("href", '@Url.Action("UserAgreement","Home")'), a.text("user agreement"))
})
})
TrL
  • 32
  • 2
0
<script>
function chooseAgreementLink() {
    if ($('#IsConsultant').attr('checked')) {
        setAgreementLink("ServiceProviderAgreement", "service provider agreement");
    }
    else {
        setAgreementLink("UserAgreement", "userprovider agreement");
    }
}
function setAgreementLink(controller, text) {
    var lnkAgreement = $('#lnk-agreement');
    lnkAgreement.attr('href', '@Url.Action(controller, "Home")');
    lnkAgreement.text(text);
}
$(document).ready(function () {
    setAgreementLink();
    $('#IsConsultant').click(function () {
        setAgreementLink();
    };
};
</script>
David M
  • 71,481
  • 13
  • 158
  • 186
0

Something like this should do.

jQuery(function($) {

    var lnkAgreement = $('#lnk-agreement'),
        isConsultant = $('#IsConsultant'),
        handler = function () {
            var isChecked = isConsultant.is(':checked');
            lnkAgreement
                .attr('href', isChecked ? 
                    '@Url.Action("ServiceProviderAgreement", "Home")' : 
                    '@Url.Action("UserAgreement", "Home")'
                    )
                .text(isChecked ? 'service provider agreement' : 'user agreement')
                ;
        };

    isConsultant.on('click', handler);
    handler();

});

  1. Chain your methods when you can,
  2. Encapsulate in a function when you can,
  3. Cache your variables when appropriate.

I'm thinking you can simplify your Razor as well by omitting "Home" from the UrlHelper.Action method if you're calling it from a view within the same controller.

Richard Neil Ilagan
  • 14,627
  • 5
  • 48
  • 66