2012-05-24 2 views
1

백본 모델 내부에서 인스턴스 변수를 어떻게 정의해야하는지 궁금합니다. 이것은 내가 현재를하고 있어요 방법입니다 :Backbone 모델에서 인스턴스 변수를 정의하는 올바른 방법은 무엇입니까?

class GeneSet extends Backbone.Model 
    initialize: (parsedGenes)-> 
     @set parsedGenes: parsedGenes 
     @set geneNames: (gene.gene_name for gene in @get("parsedGenes")) 
     @set geneIds: ("gene_#{id}" for id in [[email protected]("parsedGenes").length]) 
     @set columnNames: @getColumnNames() 
     @set columnGroups: @getColumnGroups() 
     @set geneExpressions: @getGeneExpressions() 
     @set groupedGeneExpressions: @getGroupedGeneExpressions() 
     @set extent: @getExtent() 

    clusterColor: -> 
     d3.scale.category20()() 

    getGeneNameById: (geneId)-> 
     @get("geneNames")[@get("geneIds").indexOf(geneId)] 

    getColumnGroups: -> 
     _.uniq((@get("columnNames")).map((columnName)-> 
      columnName.split("_")[0] 
     )) 

    getExtent: -> 
     expressions = _.flatten(@get("geneExpressions").map (geneExpression)-> 
      geneExpression.map (item)-> 
       item.y 
     ) 
     d3.extent(expressions) 

    getColumnNames: -> 
     Object.keys(@get("parsedGenes")[0]).filter (columnName) -> 
      !columnName.match(/cluster/) && isNumber(parsedGenes[1][columnName]) 


    getGeneExpressions: -> 
     @get("parsedGenes").map (gene) => 
      @get("columnNames").map (columnName) -> 
       x: columnName 
       y: +gene[columnName] # make numeric 

@set columnGroups: @getColumnGroups()을 할 약간 중복 보인다 상세 종류의 것 @get("...")를 사용하여 모든 변수를 얻기 위해 필요 (내가 @variableName을 할 수 있으면 좋겠다). 내 질문은, 이것이 모델과 인스턴스 변수를 사용하는 올바른 방법인가 아니면 잘못 했는가? 이 일에 어떤 차이가 단지 @model.columnNames

+0

두 번째 방법으로 어떻게 특성을 변경합니까? 설명이 바뀌면 설명을 볼 수 없습니다. 유일한 대안은 ES5 Object.defineProperty를 사용하는 것이지만 장황하고 이전 브라우저와는 호환되지 않습니다. 게다가 그것은 백본의 "길"에 잘 들어 맞지 않습니다. – mpm

+0

나는 누군가 여기서 그것을 한 것을 본다 : http://srackham.wordpress.com/2011/10/16/getters-and-setters-for-backbone-model-attributes/ – nachocab

+0

나는 당신이 위선적 인 말을하지 않았다, 나는 말했다. 당신은 20 개의 소품을 가지고있다. .. 나는 당신이 도우미 기능을 만들 수 있었다고 생각한다. – mpm

답변

3

을하고 뷰에서 다음

class GeneSet extends Backbone.Model 
     initialize: (parsedGenes)-> 
      @parsedGenes = parsedGenes 
      @geneNames = (gene.gene_name for gene in @parsedGenes) 
      @geneIds = ("gene_#{id}" for id in [[email protected]]) 
      @clusters = (gene.cluster for gene in @parsedGenes) 
      @descriptions = (gene.description for gene in @parsedGenes) 
      @columnNames = @getColumnNames() 
      @columnGroups = @getColumnGroups() 
      @geneExpressions = @getGeneExpressions() 
      @groupedGeneExpressions = @getGroupedGeneExpressions() 
      @extent = @getExtent() 

을? : 그리고 거기 또한, 여기에 내 기본 모델의 상위 클래스에서 할 무엇이다. 백본 디자인에 대해서는 꽤 많이 있지만, 나는 getset을 사용하는 것을 너무 싫어하며 모든 속성 액세스의 실제 방법을 원합니다. 그래서 메타 프로그래밍과 명명 된 get/set 메소드를 생성합니다. 그래서 대신 할 필요의 :

model.get("name") 
model.set("name", "Tom") 

난 그냥

model.name() 
model.name("Tom") 

여기 임의 attributes 개체에 대해 자동으로이 작업을 수행하는 내 기본 코드의 할 수 있습니다.

addConvenienceMethods = -> 
    for prop, value of this.attributes 
    ((prop) -> 
     #Define a setter/getter function 
     this[prop] = (newValue...) -> 
     if newValue.length 
      obj = {} 
      obj[prop] = newValue[0] 
      this.set obj 
      return this 
     else 
      return this.get prop 
     #Use the newly-defined setter function to store the default value 
     this[prop](value) 
    ).call(this, prop) 

########## Base Model Superclass ########## 
class exports.Model extends Backbone.Model 
    initialize: -> 
    addConvenienceMethods.call this 

참고 이것은 set("key", "value")를 지원하지 수있는 나이 백본 버전에 작성되었습니다. 만약 내가 그것을 업데이트했다면 아마 그 변형을 사용할 것입니다. set flavor는 객체를 반환하기 때문에 다음과 같이 연결될 수 있습니다. model.name("John").email("[email protected]").role("admin")

관련 문제