2011-11-06 1 views
2

JavaScript는 대부분의 웹 솔루션에서 점점 더 중요한 역할을하지만 JS 코드를 서버 측 코드보다 뷰 특성에서 분리하는 것이 훨씬 어렵다는 것을 알고 있습니다. .JS 코드를 뷰에서 분리하는 방법에 대한 권장 사항 찾기

JS 코드를 분리하여 유지 관리 부담을 줄이고 가능한 한 사소한 변경 사항을 복원 할 수있는 기술은 무엇입니까? 첫 번째는 내 "비즈니스 로직"클래스와 두 번째 -

는 JS 부분이 두 개의 파일로 분할되어
<div id="signin" class="auth"> 
    <h2>Sign in</h2> 
    <div id="resultbox" class="box" style="display: none;"></div> 

    <div class="form"> 
     <p>Required fields are marked <span class="yellow">*</span></p> 
     <form action="@Url.Action(MVC.Account.Authenticate())" method="post" id="authform"> 
      <label for="Identification">Alias or email <span class="yellow">*</span></label></p> 
      @Html.TextBoxFor(m => m.Identification, new { size="22", tabindex="1" }) 

      <label for="Password">Password <span class="yellow">*</span></label></p> 
      @Html.PasswordFor(m => m.Password, new { size="22", tabindex="2" }) 

      <a href="#" class="but_styled" id="btn_signin" tabindex="3">Sign in</a> 
     </form> 
    </div> 
</div> 

:

는 구체적인 예를 제공하기 위해, 나는 다음과 같은 종류의 보이는 전망을

(function (pp, $, undefined) { 
    pp.account = {}; 

    function hideResultBox() { 
     var box = $('#resultbox'); 
     box.hide(); 
     box.removeClass('info_box').removeClass('error_box'); 
    } 
    function showResultBox(result) { 
     var box = $('#resultbox'); 
     if (result.Success === true) { 
      $('#resultbox_content').html(result.Message); 
      box.addClass('info_box').show(); 
     } else { 
      $('#resultbox_content').html(result.Message); 
      box.addClass('error_box').show(); 
      var messages = ''; 
      for (var error in result.Errors) { 
       messages += '<li>' + result.Errors[error] + '</li>'; 
      } 
      if (messages !== '') 
       $('#resultbox_content').append('<br /><ul>' + messages + '</ul>'); 
     } 
    } 

    pp.account.authenticate = function (data) { 
     hideResultBox(); 
     $.post('/account/authenticate', data, function (result) { 
      showResultBox(result); 
      if (result.Success === true) { 
       setTimeout(function() { window.location = result.Url; }, 1000); 
      } 
     }); 
    }; 
})(window.pressplay = window.pressplay || {}, jQuery); 

그리고 배선 부분 : 배선에 주로 사용되는

$(document).ready(function() { 
    $('#signin a').live('click', function() { 
     var form = $(this).closest('form').serialize(); 
     pressplay.account.authenticate(form); 
     return false; 
    }); 
}); 

문제와 위의 코드는 뷰가 보이는 방식 (요소 ID, 구조 등)에 얼마나 밀접하게 관련되어 있는지를 보여 주지만 개선 방법에 대한 좋은 아이디어는 없습니다.

이 경로를 계속 진행하면 JS 파일은 모든 종류의 뷰 특정 항목과 결합 된 적절하게 캡슐화 된 논리를 엉망으로 만든다는 결론을 얻습니다.

내가 할 수 있기를 바랄 수있는 최선인가, 아니면이 혼란을 피하기 위해 적용 할 수있는 기술이 있습니까?

서버 측에서 생성 된 "요소 선택기"JS 클래스와 같은 일종의 빌드를 개선하는 방법에 대한 저의 아이디어는 클래스 및 요소 ID에 대한 많은 문자열 참조를 사용하지 않고 JS를 작성할 수 있도록하는 것입니다. 그러나 나는 그것을 어떻게 만들 것인지, 아니면 결국 유지하는 것이 더 나쁠 것인지에 대해서는 확신하지 못한다.

답변

3

일부의 생각 :

  • 정말 "자연적으로"고유 요소를 포함 할 뷰 기능을 제외하고, 요소 "ID"값에없는 기본 기능을 수행합니다. 가능한 경우 클래스를 대신 사용하십시오.
  • "data-"속성을 사용하여 HTML의 기능 구성 정보를 JavaScript로 전달합니다. (그러나 "데이터"속성에 코드를 넣지 마십시오. 내 의견으로는 정말 끔찍한 생각입니다. 죄송합니다, Knockout의 팬들. 각자 자신에게.)
  • 이벤트 펍/서브 시스템을 사용하여 상호 종속성을 통제하기 위해 피쳐 "번들"사이.
  • <body> 클래스를 사용하면 "배선"의 효율성을 높이기 위해 여러 종류의 페이지를 특성화 할 수 있습니다. 이렇게하면 피쳐 코드가 특정 페이지에 대해 고려해야하는지 여부를 매우 빠르게 알릴 수 있습니다.

편집 —는 마지막 명확히 :의 당신이 날짜 선택기 또는 자동 완성 입력, 또는 같은 다른 것들처럼, <form> 페이지를해야 할 몇 가지 기능을 가지고 가정 해 봅시다. 때로는 양식 중 종류에만 의미가있는 기능이 있습니다. 나는 현재에 참여하고있어 웹 응용 프로그램이 너무없는

if ($('body').is('.password-form')) { 
    // perform specific initializations 
} 

: 이러한 경우, 몸 클래스를 사용하는 것은 단순한 기능 요소가 영향을위한 DOM을 바라 볼 귀찮게해야하는지 여부를 알아낼 수 있습니다 큰, 그러나 그것은 사소하지 않다 어느 쪽이든. 전체 사이트에 대해 하나의 큰 자바 스크립트 컬렉션을 유지하고 모든 페이지에 똑같이 포함시킬 수 있으며 성능에 대한 우려는 없습니다 (현재 IE7은 느리지 만이 기술은 그).

+0

마지막 두 개의 글 머리 기호에 대한 예제를 제공 할 수 있습니까? 제안을 내가 어떻게 적용 할 수있는 유형으로 변환할지는 확실하지 않습니다. –

+0

세 번째 글 머리 기호는 '게시자/구독자'라는 디자인 패턴에 대한 것입니다. http://en.wikipedia.org/wiki/Publish/subscribe –

+0

+1, 데이터 속성 사용에 대해서도 언급했기 때문입니다. 잘 기억합니다. =) –

1

자바 스크립트는 여전히 뷰의 일부이므로 자바 스크립트가 뷰와 얽히게되는 디자인이 너무 좋지 않다고 생각하지 않습니다.

인생을 더 쉽게하기 위해 할 수있는 한, 일반적인 자바 스크립트 코딩 상황을 찾아서보기에서 리팩토링하고 공통 라이브러리로 리팩터링 할 수 있어야한다고 생각합니다. 사용 및 재사용.

function hideElement(var jqElementSelector, var cssClass1, var cssClass2 var cssClass3) { 
    var element = $(jqElementSelector); 
    element.hide(); 
    element.removeClass(cssClass1).removeClass(cssClass2).removeClass(cssClass3); 
} 

을 그리고 당신은이 일이보기에 전화를 대체 할 수있다 : 당신이 당신의 hideResultBox를 다시 썼다 예를 들어, 다음과 같이합니다

CommonLib.hideElement('#resultbox', 'info_box', 'error_box'); 

이 방법은 적어도 당신이없는 많은 자바 스크립트를 유지해야합니다. 또한 로직을 전달하지 않고 단지 & 또는 id라는 이름을 사용하기 때문에 서버에서 자바 스크립트 호출 포인트를 생성하는 것이 더 쉬워지고 자바 스크립트 로직에서 자바 스크립트 인텔리 센스 기능을 잃어 버릴 염려가 없습니다. 먼저 자바 스크립트 코드의 기능이 무엇인지에 대해 생각한다 대신 ID의

+0

그건 의미가 있지만 문제의 사소한 부분 만 해결하는 것 같습니다. 나는 여전히 합리적으로 꽉 끼는 커플 링을 가지고 있는데, 아마도 뷰의 일부라고 말하면서 함께 살도록 배워야 만한다.) –

+0

종교적으로 사용된다면, 자바 스크립트는 뷰에 대한 논리가 거의 없을 것이다. 그것은 내가 상상할 수있는 최선의 것입니다. – Daryl

+0

사실,하지만 여전히 메서드를 호출하고 적절한 값을 전달해야합니다. 호출은 다른 코드의 다른 위치에있을 수 있습니다.결국 "public api"메소드에는 주어진 콜 그래프 내부에 필요한 모든 선택자를 포함하는 100 개의 매개 변수가 있습니다. 이상적인 솔루션으로는 생각하지 않습니다. –

1

, 내가 더 "기능 방법" 생각 것 ... , 가 다음 그 방법으로 코드를 만들 귀하의 견해에 의해 사용될 수 있습니다.

차이점이 있습니까?

당신이하는 방식은 다음과 같습니다. 첫 번째보기, 다음 자바 스크립트 코드 ... 내가 제안하는 것 : 자바 스크립트 먼저 다음보기 요소. 이 방법을 사용하면 재사용 가능한 자바 스크립트 코드 기반을 코딩 할 수 있습니다.

ID를 사용하는 대신 클래스를 사용하십시오. 코드를 일반적인 목적의 lib처럼 재사용 할 수있게하십시오. ".myClass div a"와 같은 고정 된 구조는 필요하지 않습니다. div가 재사용 가능성을 없애고 있습니다. 내부 클래스로 대체하십시오. ".myClass .innerClass a",이 방법으로 클래스를보기에 적용 할 수 있습니다. 보기가 코드를 지배하지 못하도록합니다.

자바 스크립트 코드를 직접보기에 최소화 할 수있는 한 최소화하십시오. 간단하고 설명적인 메소드 이름을 사용하여 자신의 라이브러리에 대한 메소드 호출을 사용하십시오. 함께 자바 스크립트를 넣어보십시오. 선언적 자바 스크립트를 사용하지 마십시오. 이미이 작업을 수행하고 있습니다. 이것은가는 길입니다! =)

디커플링은 유지 관리 가능성을 높이는 입증 된 방법이기 때문에 유지 관리는 걱정하지 마십시오.

+0

좋은 제안, 특히 고정 된 구조를 해결하기위한 팁. 나는 JS를 먼저 해봐야 할 것이다.하지만 어떻게 든 그것이 필자가 필요하다는 것을 알기 전에 어떻게 든 논리를 작성하는 것처럼 느껴진다. 나는 그것을 시도해 보겠습니다 :) –

+0

* 당신이 필요로하는 것을 알기 전에 논리를 쓰지 마십시오! * 또한 또한, * 당신이 당신의 시야에 손을 넣었을 때만 당신이 필요로하는 것을 발견하게하지 마십시오. 첫 번째보기는 실물 모형이어야하며 코드를 작성한 다음 마지막으로 실물보기로 돌아가서 코드에 적용합니다. =) –

+0

나는 그것을 좋아한다! 그것은 현재의 프로젝트에서 사용하기가 어려울 것입니다. 다른 페이지와 스타일의 톤을 가진 웹 템플릿을 구입했기 때문에. 내가 갈 때 수정하지만, 거의 완료된 정적 뷰로 시작합니다. 다음 번에 나는 누군가를 고용하여 사실을 대신하여 스타일을 꾸미겠습니다.) –