2

내 API 응답 :업데이트 모델하지만 전체 백본 수집을 지속

{ 
    firstName: '', 
    lastName: '', 
    notifications: [ 
    { 
     category: '1', 
     subcategory: '', 
     source: '', 
     optInDate: '', 
     optOutDate: '', 
     active: '' 
    }, 
    { 
     category: '2', 
     subcategory: '', 
     source: '', 
     optInDate: '', 
     optOutDate: '', 
     active: '' 
    } 
    ] 
} 

응답에 대한 나의 대응하는 백본 구현은 다음과 같습니다

나는 단지 업데이트 할
var Notification = Backbone.Model.extend({ 
    initialize: function (args) { }, 
}); 

var Notifications = Backbone.Collection.extend({ 
    model: Notification, 
    url: '/xyz/abc', 

    parse: function (data) { 
    return data.notifications; 
    }, 
}); 

"카테고리 1" 모델 (이것은 항상 사실입니다)이라고 말하면서 active: true이지만 변경된 모델뿐만 아니라 요청 페이로드에 전체 컬렉션을 유지합니다. 백본으로 이것을 어떻게 달성 할 수 있습니까?

특정 모델을 가져 와서 model.set({active: true})을 호출하고 model.save()을 호출하려고 시도했지만 그 모델 만 서버에 보냅니다.

전체 응답을 업데이트 된 모델과 함께 서버에 보존해야합니다.

편집 :

내가 아래에 그의 대답에 @Khang's help와이를 달성 할 수 있었다. 그러나 컬렉션과 함께 다른 속성을 보내야한다는 점을 잊어 버렸습니다. 즉 위의 응답에서 firstName, lastName입니다.

나는 아래를 포함하도록 parse 메서드를 재정 해요 : 내가 Backbone.sync를 호출 할 때

parse: function(data) { 
    this.firstName = data.firstName; 
    this.lastName = data.lastName; 
    return data.notifications; 
} 

는 여전히 페이로드에 불과 컬렉션을 보냅니다. 그 이유는 구문 분석 메서드에서 데이터 개체의 알림 만 반환하기 때문입니다.

답변

3

백본 소스 코드를 읽고 제안이 작동하는 이유

Backbone.sync("update", Notifications, { 
    attrs: { 
     data: Notifications.toJSON(), 
     firstName: 'foo', 
     lastName: 'bar', 
    } 
}); 

가 이해하기 : 그렇지 않으면 당신은 당신이 그것을 필요로 할 때 사용자 정의 데이터를 가지고 options.attrs을 사용할 수 있습니다 Khang suggestsBackbone.sync 함수를 덮어 쓰는 것이 모든 모델과 컬렉션에서 공유되므로 극히주의해야합니다..

현재 귀하의 유스 케이스에서는 작동하지만 장기적으로는 더 많은 패치입니다.


API는이 통지를 관리 할 수있는 엔드 포인트를 제공 할 것이다, API가 진정으로 편안하고 있었다면 전체 DTO는

: 편안하고 유지하기 위해 페이로드 다시 전송 될 것으로 예상 개별적으로

향후 독자를위한 참고서로서 모델을 개별적으로 관리하기위한 엔드 포인트를 만드십시오. 이것은 REST API를 만들 때 갈 방법입니다. another answer에서 백본을 염두에두고이 기술의 장단점을 살펴 보겠습니다. API 응답은 모델이 아닌 컬렉션을 나타내는한다 그렇지, 그 의미 할 수 있기 때문에

API는 구현

변화에 열려 있지 않습니다. 백본은 개체가 모델이어야하고 개체 배열이 컬렉션이어야하는 RESTful API를 기반으로 미리 정의 된 동작을 제공합니다 (페이지 수와 같은 컬렉션과 함께 메타 데이터를받을 때 예외). 백본 ​​컬렉션에는 이러한 이유로 인해 save 기능을 사용하면 한 번에 모두 저장하면 안됩니다.

귀하의 경우에는 아마 사용자 모델이 작업을 수행하는 것처럼 보입니다.

alternatives to implement a collection within a model이 많이 있습니다. 여기에 간단한 예가 하나 있습니다.

var UserModel = Backbone.Model.extend({ 
    urlRoot: '/xyz/abc', 
    initialize: function(attrs, options) { 
     // init a collection within the model 
     this.notifications = new Notifications((attrs || {}).notifications); 
     // update the collection whenever the model is synced. 
     this.listenTo(this, 'sync', this.onSync()); 
    }, 

    // Useful abstraction that doesn't interfere with the normal use-case 
    saveNotifications: function() { 
     return this.save({ 
      notifications: this.notifications.toJSON() 
     }, { patch: true }); 
    }, 

    onSync: function() { 
     this.notifications.reset(this.get('notifications')); 
    } 
}); 

당신은 다른

var user = new UserModel({ id: 'user-id-1' }); 
user.fetch(); 

같은 모델을 사용할 수 있습니다 그리고 당신은 통지를 필요로 할 때, 그들은 편리한 모음 내에서 이미 사용할 수있어. 알림 컬렉션 사용자 모델에 syncreset 같은

var notif = user.notifications.findWhere({ category: '1' }); 
if (notif) { 
    notif.set({ active: true }); 
    user.saveNotifications(); 
} 

백본 이벤트가 올바르게 트리거합니다.

많은 양의 데이터를 다룰 때이 기술에 대한 단점이 있습니다. 컬렉션의 모든 것을 한 번에 절약하면 어쨌든 불이 들어옵니다. 지연로드페이지 매기기은 이러한 상황에서 성능을 향상시키는 방법이며, 분명히 REST best practices을 따르는 것이 많은 도움이 될 것입니다.

우리 회사에서 API는 크게 "Build APIs you won't hate"에 의해 영감을 받았으며이 책을 사용하고있어서 기쁩니다.

0

내가 무엇을 하려는지 확실치 않지만, 나에게 맞는 것 같지 않습니다. 한 모델 만 변경되면 전체 컬렉션을 서버로 보내는 이유는 무엇입니까? 변경되지 않은 모델이 이미 서버에 있습니까? 나는이 접근법을 재고해야한다고 생각합니다.

업데이트

Backbone.sync("update", Notifications); 

더 많은 문서 here : 당신이 정말로 필요하면

어쨌든, 이것은 당신이 원하는 것을 얻을 것이다 당신이 매일 함께 보낼 수 많은 여분의 데이터가있는 경우

컬렉션이 sync 인 경우 컬렉션의 사용자 지정 동기화 동작을 사용하려면 sync 메서드를 재정의 할 수 있습니다. 난 당신이 sync를 사용하지 않는 내가 말할 것 Backbone.sync

+0

API는 RESTFul을 유지하기 위해 전체 DTO가 페이로드로 다시 전송되기를 기대하므로 전체 콜렉션을 페이로드로 다시 보내야합니다. API는 구현 변경에 개방되어 있지 않으므로 프런트 엔드에서 수행해야합니다. Backbone.sync는 어떻게 도움이됩니까? model.set 뒤에 sync를 호출해야합니까? 및 model.save()? – arjary

+0

'save'를 호출 할 필요없이'set'으로 모델을 업데이트하고 db32에 지속하기를 원할 때'sync'를 호출합니다. 작동 한 것은 – Khang

+0

입니다. 죄송합니다. 나는 위의 응답에서 firstName, lastName과 같은 다른 속성도 컬렉션과 함께 보내야한다는 점을 잊어 버렸습니다. 나는 아래와 같이 그들을 파싱하는 방법을 오버라이드했다. - parse : function (data) { this.firstName = data.firstName; this.lastName = data.lastName; return data.notifications; } Backbone.sync를 호출해도 여전히 페이로드에 컬렉션 만 전송됩니다. 그 이유는 구문 분석 메서드에서 데이터 개체의 알림 만 반환하기 때문입니다. 내가 어떻게 이걸 얻을 수 있니? 도와 주셔서 감사합니다 ! – arjary