2012-07-24 1 views
1

오랫동안 읽지 못해 죄송하지만 어쨌든 생각을 공유 할 수 있다면 좋을 것입니다. :) 마크 업 기반 DOM 지원 실행을 사용할 때 js 함수를 처리하는 방법

그래서 .. 기술이 여기에 폴 아일랜드어의 블로그 게시물에 설명되어 있습니다 - http://paulirish.com/2009/markup-based-unobtrusive-comprehensive-dom-ready-execution 다음 여기에 제이슨 가버 확장 - http://viget.com/inspire/extending-paul-irishs-comprehensive-dom-ready-execution.

주요 아이디어는 특정 페이지 (컨트롤러 및/또는보기)가로드 될 때 (DOM 준비 상태로) 실행될 예정인 모든 코드를 포함하는 json 개체를 갖는 것입니다. DOM을가 APP.controller_name.view_name()에 자동으로 전화가 준비가되면 그럼 당신은 일부 JS 케이크와 함께 당신의 <body>

<body data-controller="controller_name" data-action="view_name"> 

다음을 변경

APP = { 
    controller1 : { 
    view10: function(){ ... }, 
    view11: function(){ ... } 
    }, 
    controller2: { 
    view20: function() {...}, 
    view21: function() {...} 
    } 
} 

:

목적은 같은 것을 보일 것이다.

실행할 수있는 모든 DOM 실행 가능 스크립트를 한 곳에서 처리 할 수 ​​있고 추가 코드없이 이러한 스크립트가 실행되기 때문에 매우 멋지다.

이제 실제 질문 : 는 DOM 이벤트가 발생했을 때 (예 : onclick을 준비하지만 때 실행되지 않는 것으로 특정 컨트롤러 나보기/페이지에 대한 다른 JS 함수로 무엇을 할 수 = "someFunction()"?

이러한 함수가 적절한 APP.controller_name 네임 스페이스 내에 있으면 좋을 것입니다. 코드를 유지하는 데 도움이 될 수 있기 때문입니다. 그리고 그 말로는 현재 APP 객체를 다음과 같이 변경하고 있습니다.

APP = { 
    controller1 : { 
    view10: function(){ ... }, 
    view11: function(){ ... }, 
    extraStuff10: function:() {...}, 
    extraStuff11: function:() {...} 
    }, 
    controller2: { 
    view20: function() {...}, 
    view21: function() {...}, 
    extraStuff20: function:() {...} 
    } 
} 

그리고 이것이 모두 좋은 것입니다 - APP.controller1.view10()이 자동으로 실행되며 나중에 필요할 때 APP.controller1.extraStuff10()으로 전화 할 수 있습니다. 그러나 하나의 심각한 그 구조에 대한 단점 - view10()과 extraStuff10()은 절대적으로 동일한 구조를 가지므로 extraStuff10()이 이벤트 발생시 실행을 기다리고있는 함수인지 여부를 알 수 없습니다. extraStuff라고하는 실제 뷰/페이지이며 페이지가로드 될 때 해당 함수의 내용이 실행됩니다.

APP = { 
    controller1 : { 
    view10: { 
     init(): function(){ ... } 
    }, 
    extraFunction10: function:() {...} 
    } 
} 

을 : 나는 그런 식으로 (우리가 내부의 스크립트에 대한-DOM 준비 배치됩니다) 초기화() 함수를 포함하는 객체에 함수 view10()를 변경 생각하고

이것은 DOM- 준비 함수와 다른 함수의 명확한 분리를 제공 할 것이지만 그것이 그 물건을 성취하는 가장 좋은 방법인지 궁금해하고있다 ... 어떤 아이디어?

+1

필자는 비슷한 시스템으로 모델링 된 PHP 아키텍처를 보아 왔습니다. 나에게 당신은 js에서이 방법을 정당화하기 위해 노력하는 꽤 힘든 일을하고 싶습니다. – Nick

+0

실제로 말하기는 어렵고 실제로 특정 프로젝트에 의존합니다. 현재 주 js 파일 크기의 두 배인 라이브러리가 있습니다. 그리고 저는 jQuery도 계산하지 않았습니다. (이것은 내 전체'app' 코드보다 훨씬 큽니다.) – isHristov

답변

1

이것은 좋은 패턴이지만 한 파일만으로 모든 규칙을 다루는 것이 곧 다루기 힘들어지기 때문에 조금 더 나누는 것이 좋습니다. 앱이 50 페이지로 증가하면 어떻게됩니까? 모든 파일을 매우 많은 페이지에로드해야하는 편집을 위해 괴물 파일이 생겨 다운로드 시간과 구문 분석 시간이 늘어납니다.

액세스 할 페이지에 따라 동적으로로드되는 작은 JS 라이브러리 파일은 잘 작동합니다. 그런 다음 함수를 APP 전역 네임 스페이스에 첨부하여 페이지간에 다시 사용할 수 있습니다.컨트롤러 코드는 간단한 onclick 등을 첨부하여 이미로드 된 라이브러리 항목이 트리거되도록하므로 빛이 그대로 유지됩니다.

라이브러리를 올바른 순서로로드하기 위해 요구 사항 관리자를 사용하는 방향으로 이동하는 것이 좋습니다. http://requirejs.org/docs/jquery.html

+0

Google의 JavaScript는 이전에 많은 파일에 있었지만 (제안 된 내용과 같이 매우 잘 구조화되지는 않았지만) 코드를 관리하는 최적의 방법은 아니었기 때문에 모든 것을 한 곳에 모아서 항상 알았습니다. 특정 페이지 관련 코드 나 기능을 찾을 곳. APP.controllerX 네임 스페이스에 대한 코드가 어느 시점에서 너무 커지면 언제든지 컨트롤러 X.js에 넣고 거기에'app.controllerX = {..}'를 정의 할 수 있습니다. 다운로드 시간은 문제가되지 않을 것입니다. 왜냐하면 모든 것이 캐싱되고 파싱이 그다지 오래 걸리지 않기 때문입니다. – isHristov

+0

그리고 JavaScript 파일을 제공하고 결합하기 위해 우리는 Minify를 사용하고 있습니다. requirejs와는 반대로 서버에서 PHP와 작동하기 때문입니다. – isHristov

+0

충분합니다. 분명히 별도의 app.controllerX.js를 갖는 것에 동의 할 것입니다. 페이지 별 코드가 많이 있다고 생각하는 것이 맞습니까? 과거에 유사한 문제를 해결하기 위해 페이지를 작은 재사용 가능한 섹션으로 나누었습니다. 각각의 섹션은 viewX.js가 포함 된 자체 viewX.php가 있지만 가능하지는 않습니다. 데스크톱에서는 캐싱과 구문 분석이 정상적으로 작동하지만 태블릿과 모바일은 대개 캐시가 매우 작고 물건을 파싱하는 데 더 오래 걸릴 수 있으므로 여전히 문제가 될 수 있습니다. –