5

나는 Marionette을 사용하여 Backbone 응용 프로그램을 개발 중이며 코드에서 논리를 구성하는 데 도움이 필요합니다.Backbone js에서 논리를 추상화

뷰 1

onRender: function() { 
    var pluginData = this.$("selector1").plugin(); 
    var pluginResult = this.handlePluginData(pluginData); 
    this.doSomethingWithResult1(pluginResult); 
} 

뷰 2

onRender: function() { 
    var pluginData = this.$("selector2").plugin(); 
    var pluginResult = this.handlePluginData(pluginData); 
    this.doSomethingWithResult2(pluginResult); 
} 

:

현재는 내가 추상적으로이 반복을 피하려고, 난 정말 비슷한 논리를 처리 할 몇 가지 전망을 기타

참고 : handlePluginData은 같은 일을합니다. doSomethingWithResultN은 다르지만 약간의 매개 변수로 추상화 될 수 있습니다.

그래서 질문은 다음과 같습니다 : I 추상적이해야? 나는 BaseView 클래스에서 확장하고 거기에 논리를 추가 생각하지만, 더 나은 방법이 있는지 모르겠어요 어떻게

  • .

  • 계산을 처리하는 사용자 정의 Model 클래스를 추가해도됩니다. 나는 한동안 rails을 사용 해왔고 Model === 데이터베이스의 테이블에 익숙해졌습니다.

대단히 감사합니다.

+0

[Code Review] (Code Review) (http : //codereview.stackexchange.com/)에 대해 더 좋은 질문 인 것처럼 보입니다. – Mathletics

+0

Hum, 당신은 옳을 수도 있지만, 나는 그 코드를 추상화하고 싶습니다. 질문은 특히 백본에서 어떻게해야하는지 묻고, "테이블"이없는 모델을 사용한다면 괜찮습니다. – NicoSantangelo

+1

질문이 "이 코드가 있는데 어떻게 변경합니까?"라는 코드 검토가있을 때 백본이든 아니든간에. 귀하의 두 번째 질문에 대해, "괜찮습니까 ..."는 일반적으로 의견을 기반으로한다는 것을 의미합니다. 모델을 추가 할 수 있습니까? 물론 당신은 할 수! 너? 나는 모른다. 그 "모델"이 단지 _other_ 모델들에 대한 계산을 실행하고 있다면, 당신은 헬퍼 클래스 (모델과 같은 것일뿐,'백본 모델이 아닙니다.)를 사용하는 것이 더 좋을 것 같습니다. – Mathletics

답변

1

백본 뷰 클래스는 충분히 추상적이라고 생각합니다. 새 View 인스턴스를 만들 때 다른 옵션을 전달하면됩니다.

그리고 계산 논리를 View의 렌더링 메소드에 배치 한 것으로 나타났습니다. Backbone은 MVC 기반 프레임 워크이기 때문에 View가 관심을 갖는 Model fire 이벤트가 발생할 때 레이아웃 렌더링을 담당하는 Model 및 View 레지스터 이벤트 핸들러에 로직을 배치해야합니다.

내 의견으로는, 계산하고보기를 재정의하는 모델을 추가 할 수 있습니다.

내 간단한 예 :

1.Define 계산 로직에 대한 응답입니다 모델 :

var MathModel = Backbone.Model.extend({ 
    result: 0, 
    initialize: function(){ 
     console.log("calculate target: "+this.get("selector")); 
     console.log("calculate method: "+this.get("method")); 
     var number = this.handlePluginData(); 
     this.doSomethingWithResult(number); 
    }, 
    handlePluginData: function(){ 
     return $(this.get("selector")).text(); 
    }, 
    doSomethingWithResult: function(number){ 
     if(this.get("method")==="square"){ 
      this.set({result:(number*number)}); 
     }else{ 
      this.set({result:(number*number*number)}); 
     } 

    } 
}); 

2.Redefine View 클래스 :

보기 모델의 청취자를 등록합니다 " 결과 "데이터 변경 이벤트를 지정하고 할당 한 모델에 따라 초기 레이아웃을 렌더링합니다.

var AbstractView = Backbone.View.extend({ 
     initialize: function(){ 
      this.listenTo(this.model,"change",this.onModelChange); 
      this.number = this.model.get("result"); 
      this.render(); 
     }, 
     render: function(){ 
      this.$el.html(this.number); 
     }, 
     onModelChange: function(model){ 
      this.number = model.get("result"); 
      this.render(); 
     }, 
     plusOne:function(){ 
      this.model.doSomethingWithResult(this.model.handlePluginData()); 
     } 
    }); 

3. 새보기를 인스턴스화 할 때 모델링 할 다른 옵션을 지정하십시오.

var view1 = new AbstractView({el:"#result1",model:new MathModel({selector:".square",method:"square"})}); 
var view2 = new AbstractView({el:"#result2",model:new MathModel({selector:".cubic",method:"cubic"})}); 

4.HTML :

<div id="select-target"> 
    <span class="square">2</span> 
    <span class="cubic">2</span> 
    <button id="plus-one">+1</button> 
</div> 
<div id="result"> 
    <span id="result1"></span> 
    <span id="result2"></span> 
</div> 

5.Plus-one 단추 클릭 이벤트 처리기 :

모델이 변경되면 View에서 레이아웃을 다시 렌더링하는 방식을 관찰 할 수 있습니다.

$("#plus-one").click(function(){ 
     $(".square").text(Number($(".square").text())+1); 
     $(".cubic").text(Number($(".cubic").text())+1); 
     view1.plusOne(); 
     view2.plusOne(); 
    }); 

희망이 도움이 될 것입니다.

+0

그것은 도움이됩니다, 감사합니다!. 나는 여전히'MathModel = Backbone.Model.extend'로 확신하지 못한다. 나는 커스텀 클래스를 사용하여 그것을 인스턴스화 할 것이라고 생각한다. – NicoSantangelo