웹 서비스를 Backbone이있는 단일 페이지 웹 응용 프로그램으로 이식하고 있습니다. 헤더에는 기본 레이아웃이 있으며, 빈 곳은 div#content
이고 뷰와 꼬리말을 첨부합니다.여러보기 인스턴스의 코드가 충돌을 일으킬 수 있습니다.
모든 경로는 해당보기를 만들고 이전에 렌더링 된보기를 새로운 것으로 대체하는 div#content
에 연결합니다.
require.js
을 사용하여 백본 앱을로드하고 있으며 종속성이 있습니다. 모든 백본 코드는 상당히 작습니다. 라우터와보기 만 사용하기 때문에 하나의 파일입니다. 이 AMD 모듈은보기에서 사용되는 파일 내보내기 기능 util.js
에 따라 다릅니다. 보기를 작성하고 렌더링 한 후 util.js
에서 필요한 유틸리티 (jquery stuff, ajax 등)를 실행합니다.
보기를 렌더링 할 때 유틸리티가 호출되고 다른 경로로 이동하여 새보기가 만들어지면 새보기의 유틸리티가 호출되지만 이전보기의 유틸리티는 여전히 실행 중입니다. .
언젠가는 5 개의보기와 같은 유틸리티를 사용하여 때때로 충돌이 발생합니다.
stop/start
유틸리티는 일종의 서비스로 작동해야하기 때문에 제 접근 방식이 좋지 않다는 것이 확실합니다.
내 현재의 접근 방식을 보여줍니다 관련 코드를 붙여 넣을 수 있습니다 :
require(["utilities"], function(util) {
...
Application.view.template = Backbone.View.extend({
el: "div#content",
initialize: function(){
this.render();
},
render: function(){
var that = this;
// ajax request to html
getTemplate(this.options.template, {
success: function(template) {
var parsedTemplate = _.template(template, that.options.templateOptions || {});
that.$el.html(parsedTemplate);
// execute corresponding utilities
if(that.options.onReady) {
that.options.onReady();
}
},
error: function(template) {
that.$el.html(template);
}
})
}
});
...
Application.router.on('route:requestPayment', function(actions) {
var params = { template: 'request-payment', onReady: util.requestPayment };
var view = new Application.view.template(params);
});
...
});
util.requestPayment
이 문제를 어떻게 처리해야하는지 혼란 스럽습니다. 나는 분명히하고 희망이나 도움을 주시면 감사하겠습니다.
편집 :utilities.js
조각 :
...
var textareaCounter = function() {
$('#requestMessage').bind('input propertychange', function() {
var textarea_length = 40 - $(this).val().length;
if(textarea_length === 40 || textarea_length < 0) {
$('#message-counter').addClass('error').removeClass('valid');
$("#submitForm").attr('disabled', 'disabled');
}
else if(textarea_length < 40 && textarea_length > 0) {
$('#message-counter').removeClass('error');
$("#submitForm").removeAttr('disabled');
}
$('#message-counter').text(textarea_length);
});
}
...
var utilities = utilities || {};
...
utilities.requestPayment = function() {
textareaCounter();
initForm();
preventCatching();
requestPaymentCalcFallback();
};
...
return utilities;
...
왜 initialize() 내부에서 .render()를 호출합니까? utilities.js 파일의 스 니펫을 게시 해주십시오. 어떻게합니까? – mamoo
@mamoo 다른 행에서 렌더링하지 않으려면. – jviotti
@mamoo, utilities.requestPayment 모듈에서 제공하는 것입니다. 나는 한 가지 기능의 정의만을 복사했다. 다른 것들은 비슷하지만 그냥 jquery 물건과 일부 아약스 폴링 – jviotti