2016-08-09 18 views
0

백본 모델을 만들고 변경 이벤트를 첨부하면 해당 이벤트가 수신 대기합니다. 그리고 이벤트를 동시에 변경하면 (동일한 호출에서) 변경 이벤트가 모델의 변경 횟수만큼 발생합니다.백본 모델은 한 번만 변경합니다.

그래서 필터가있는 격자 모양의보기가 있고 필터를 변경할 때마다 새로 고침해야한다고 상상해보십시오.

내 기본 모델은 다음과 같습니다

defaults: { 
    filters: { 
     from: '2016-01-01', 
     to: today.format(format), 
     limit: 25, 
     page: 1, 
     cycle: 'all' 
    } 
}, 

내가보기에서 모델의 청취자를 가지고 :

this.listenTo(this.model, 'change:filters', this.onShow); 

그리고 필터를 변경할 때마다 내가 할 :

this.model.set('filters', { 
    from: '2016-07-01', 
    to: '2016-07-31', 
    limit: 25, 
    page: 1, 
    cycle: 'currentMonth' 
}); 

본인은이 모델의 3 가지 속성을 변경했습니다. 변경 이벤트가 3 번 발생합니다. 내가 원했던 것은 모델에 3 가지 변경 사항이 있더라도 한 번만 변경된다는 것입니다.

그게 가능합니까? 백본 문서에서 사전

+2

변경 이벤트는 한 번만 발생합니다. http://jsfiddle.net/nikoshr/u254vzmb/'filters' 객체를 공유하지 않으려면 함수에'defaults'를 래핑해야합니다. http : // backbonejs.org/#Model-defaults (작은 줄) – nikoshr

+0

nikoshr이 모든 수에 적합합니다. 문제가 무엇이든, 당신의 질문에 당신이 묘사 한 것이 아닙니다. 그 중 하나, 또는 당신이 보여주는 다른 일이 있습니다. – Louis

답변

0

에서

감사 :

"변화 : [속성]"(모델, 가치, 옵션) - 특정 속성이 업데이트되었습니다.

귀하의 사례 모델에는 filters이라는 속성이 있습니다. 이 속성에 새 값을 설정하면 (object, array, int, float, string과 상관없이) 이벤트가 발생합니다. 한 번만.

속성 값의 수정을 관찰해야하는 경우 사용자가 직접 처리기를 작성해야합니다.

this.listenTo(this.model, 'change:filters', function(model, value) { 
    prev = model.previous('filters'); 
    if(prev.from != value.from) model.trigger('change:filters:from', model, value.from); 
    if(prev.to != value.to) model.trigger('change:filters:to', model, value.to); 
    if(prev.limit != value.limit) model.trigger('change:filters:limit', model, value.limit); 
    if(prev.page != value.page) model.trigger('change:filters:page', model, value.page); 
    if(prev.cycle != value.cycle) model.trigger('change:filters:cycle', model, value.cycle); 
}); 

및 코드에서

: 마리오네트의 컬렉션 또는 CompositeViews를 사용하여 기본 컬렉션 변경을 듣고 대부분의 경우 나는이 상황으로 실행했습니다

this.listenTo(this.model, 'change:filters:from', this.onShow); 
this.listenTo(this.model, 'change:filters:to', this.onShow); 
this.listenTo(this.model, 'change:filters:limit', this.onShow); 
this.listenTo(this.model, 'change:filters:page', this.onShow); 
this.listenTo(this.model, 'change:filters:cycle', this.onShow); 
0

. 종종 하나 이상의 자식 모델이 업데이트되고 CompositeView가 다시 렌더링되거나 다시 정렬되어야하지만 모든 자식 모델 변경에 대해 다시 렌더링하거나 순서를 변경하기를 원하지 않았습니다. 하나 이상의 변경 사항이 동시에 발생합니다. 나는 다음과 같은에서는 setTimeout 이것을 처리 :

var MyView = Backbone.Marionette.CompositeView.extend({ 
    childView: ChildView, 
    initialize: function() { 
     this.listenTo(this.collection, 'change', this.onChildModelChanged); 
     this.childModelChanged = false; 
    }, 
    onChildModelChanged: function() { 
     // use a setTimeout 0 so that we batch 'changes' and re-render once 
     if(this.childModelChanged === false) { 
      this.childModelChanged = true; 
      setTimeout(function() { 
       this.render(); 
       this.childModelChanged = false; 
      }.bind(this), 0); 
     } 
    } 
}); 

이 모든 자식 모델 변경 이벤트가 다시 렌더링 또는 재 주문 전에 발사 할 수 있습니다. 희망이 도움이됩니다.

0

문제의 시나리오에 대한 해킹 종류라고 생각하십시오. 모델에 사용자 정의 이벤트를 정의 할 수 있습니다.

  • 모델 change-filters
  • 패스 옵션 silent : true 당신이 모델을 설정하는에 사용자 정의 이벤트를 듣습니다.
  • 변경된 특성이있는 경우 모델에서 사용자 지정 이벤트를 트리거합니다.