2014-01-13 5 views
3

백본/marionette.js를 사용하여 .eco 템플릿 내에서 모델의 메서드에 액세스하려고합니다. 나는 Expense 모델을 day() 메쏘드로 가지고 있는데, 이는 moment.js를 사용하여 '13th'를 반환한다. 예를 들면 :Marionette.js에서 Backbone.Model 메소드에 액세스하는 방법 ItemView template?

class Expense extends Backbone.Model 
    day: -> 
    moment.get('date').format('Do') 

나는 다음과 같은 새로운 Expense를 작성하고 호출 day() 방법 할 수 있습니다

coffee = new Expense({name: "Coffee", amount: 2.50, date: "2014-01-13T13:50:00Z"}) 
coffee.day() # 13th 

을하지만, 다음과 같은보기 내에서 day()에 액세스를 시도하고 템플릿은 나에게 몇 가지 문제를 일으키는 :

class ExpenseView extends Marionette.ItemView 
    template: "views/_expense" 
# views/_expense.jst.eco 
<h3 class="expense__name"><%= @name %></h3> 
<p class="expense__day"><%= @day() %></p> 

I 을 이해하면이 작동하지 않습니다 ... ItemView@model.toJSON()을 반환하는 serializeData을 호출하므로 Expenseday() 메서드에 액세스 할 수 없습니다. 모델 방법을 템플릿에 사용할 수 있도록 백본/마리오 네트 커뮤니티에 설정된 패턴이 있습니까? 이 문제에 대해 갈 수있는 가장 좋은 방법인지 내가 확실 해요

class ExpenseView extends Marionette.ItemView 
    template: "views/_expense" 

    serializeData: -> 
    _.extend(@model.toJSON(), model: @model) 

    templateHelpers: 
    day: -> 
     @model.day() 

을하지만 :

지금까지, 나는 그것이 작동되도록하려면 다음을 수행 한? 감사!

답변

7

당신은 항상 templateHelpers 또는 serializeData에 추가 할 수 있습니다 (... 커피 구문을 기억 할 수 없습니다) -하지만 당신이 정말로에 대해 요구하고하는 가상의 속성입니다 - 모든 템플릿의 일부가 될 수있는 하나는, 이 속성은 ViewModel의 일부로 만 사용됩니다. 이러한 방법으로 우리는 거기에이 작업을 수행하는 몇 가지 플러그인이 있으며, 사용하는 내 개인 좋아하는 Backbone Mutators입니다 같은 save()

sync 이벤트 서버에 동기화에서 비활성화 할 수 있습니다 - https://github.com/asciidisco/Backbone.Mutators

Backbone Computed Fields 같은

기타 - https://github.com/alexanderbeletsky/backbone-computedfields는 Ember가 계산 된 속성을 제공합니다.

백본 뮤 테이터를 사용하면 중추 모델을 백본 모델에 쓸 수 있습니다.

class Model extends Backbone.Model 
    mutators: 
    day: -> 
     moment.get('date').format('Do') 

또는 백엔드에 동기화에서 '일'속성을 방지하기 위해

...

class Model extends Backbone.Model 
    mutators: 
    day: 
     get: -> moment.get('date').format('Do') 
     transient: true 

day 속성은 이제 모든 toJSON() 호출에 존재합니다.

+0

브라이언, 고맙습니다.이 백본을 좋아합니다. 뮤 테이터 플러그인! 나는 그것이 내 견해의 논리에서 모델로 어떻게 움직이는지를 좋아한다 : 레일의 스코프. 'transient : true'도 좋은 추가입니다! – danscotton

0

serializeData에 추가 하시겠습니까?

serializeData: function(){ 
    var data = _.clone(this.model.attributes); 
    data.day = this.model.day(); 
    return data; 
} 
+0

David 덕분에, 대신에 'Expense'의'toJSON' 메서드를 재정의하는 것이 더 좋을지도 모릅니다. 논리가 뷰가 아닌 모델에 캡슐화 되었습니까? – danscotton

+0

rpoblem은 'toJSON'에 추가하면 API 엔드 포인트로 전송되기 때문에 문제가 될 수 있습니다. –

+0

아하이 봐요. 어쩌면 모든'Marionette에서'serializeData'를 확장 할 수 있습니다.'toData' (또는 더 나은 이름)이라는 새로운 메소드를 호출 할 수 있도록 'View'를 호출합니다. 그렇지 않으면 정상적으로'toJSON'을 호출합니다. 그렇다면 선택적으로 모델의 속성을 내가 선택한 모든 사용자 정의 속성과 병합하기 위해 내 모델 중 하나에서'toData'를 구현할 수 있습니까? – danscotton

관련 문제