Backbone.js - Backbone에 전체 컬렉션을 저장하는 방법.sync 또는 jQuery.ajax?
저는 그것이 가능하다는 것을 잘 알고 있으며, 다음을 포함한 많은 곳을 살펴보았습니다.전체 컬렉션을 저장하는 베스트 프랙티스?)근데 그게 정확히 어떻게 암호로 쓰여져 있는지 아직 잘 모르겠어요.(이 게시물은 그것을 영어로 설명한다.javascript에 대한 자세한 설명을 듣고 싶습니다.
모형 컬렉션이 있다고 가정해 보겠습니다. 모형 자체에는 중첩된 컬렉션이 있을 수 있습니다.부모 컬렉션의 toJSON() 메서드를 덮어쓰고 유효한 JSON 개체를 가져옵니다.전체 컬렉션(대응하는 JSON)을 "저장"하고 싶지만 backbone에는 해당 기능이 내장되어 있지 않은 것 같습니다.
var MyCollection = Backbone.Collection.extend({
model:MyModel,
//something to save?
save: function() {
//what to write here?
}
});
난 네가 말하고 싶은 곳을 알아.
Backbone.sync = function(method, model, options){
/*
* What goes in here?? If at all anything needs to be done?
* Where to declare this in the program? And how is it called?
*/
}
'보기'가 처리되고 나면 컬렉션에 자신을 서버에 "저장"하도록 지시합니다(일괄 업데이트/작성 요청 처리 가능).
발생하는 질문:
- "모두 함께 배선"하기 위한 코드 작성 방법/무엇을 알려주세요.
- 콜백의 '적절한' 위치와 '성공/오류' 콜백을 지정하는 방법은 무엇입니까?통사적으로?백본에 콜백을 등록하는 구문을 잘 모르겠어요
뷰하여 jQuery.ajax를 할 수 .this.successMethod
★★★★★★★★★★★★★★★★★」this.errorMethod
/오/오오????과가있??? ??
나는 백본의 사고방식에 동조할 필요가 있다.- 나는 분명히 전체 컬렉션을 동기화하는 데 있어 w.r.t.가 부족한 것을 알고 있다.
즉시 생각할 수 있는 것은 Backbone의 save 메서드를 덮어쓰지 않는 것입니다.수집이지만 컬렉션을 다른 백본으로 랩합니다.ToJ 모델링 및 재정의SON 방식입니다.그러면 Backbone.js는 모델을 단일 리소스로 취급하기 때문에 너무 많은 생각을 하지 않아도 됩니다.
백본에 주의해 주세요.컬렉션에 ToJ가 있습니다.SON 방식이기 때문에 대부분의 작업이 완료됩니다.넌 그냥 ToJ를 대신해서래퍼 백본의 SON 메서드.Backbone. 컬렉션 모델.
var MyCollectionWrapper = Backbone.Model.extend({
url: "/bulkupload",
//something to save?
toJSON: function() {
return this.model.toJSON(); // where model is the collection class YOU defined above
}
});
아주 간단한...
Backbone.Collection.prototype.save = function (options) {
Backbone.sync("create", this, options);
};
... 컬렉션을 저장할 수 있습니다.변경된 내용에 관계없이 컬렉션의 모든 모델이 항상 서버에 게시됩니다.옵션은 일반 jQuery ajax 옵션입니다.
결국 'save'와 같은 메서드로 $.ajax를 호출하게 되었습니다.@brandgonesurfing의 제안대로 래퍼 클래스를 추가할 필요 없이 제어할 수 있게 되었습니다(아이디어가 마음에 듭니다만:). 이미 컬렉션을 가지고 있기 때문에 toJSON() 메서드를 오버라이드하고 있었습니다만, Ajax 콜에서 사용하고 있었습니다.
이걸 우연히 발견한 사람에게 도움이 되길...
이는 클라이언트와 서버 간의 계약에 따라 달라집니다.간단한 입니다. 에서 CoffeeScript로 합니다./parent/:parent_id/children
{"children":[{child1},{child2}]}
하고 PUT을 반환한다.{"children":[{child1},{child2}]}
:
class ChildElementCollection extends Backbone.Collection
model: Backbone.Model
initialize: ->
@bind 'add', (model) -> model.set('parent_id', @parent.id)
url: -> "#{@parent.url()}/children" # let's say that @parent.url() == '/parent/1'
save: ->
response = Backbone.sync('update', @, url: @url(), contentType: 'application/json', data: JSON.stringify(children: @toJSON()))
response.done (models) => @reset models.children
return response
이것은 매우 간단한 예이며, 더 많은 작업을 수행할 수 있습니다.save() 실행 시 데이터가 어떤 상태인지, 서버로 전송하기 위해 어떤 상태인지, 서버가 무엇을 반환하는지에 따라 달라집니다.
가 「PUT」인 .[{child1},{child2]
백본, 백본.이 기음 음음 음음 음음 음음 음 sync could sync could로 바뀔 수 .response = Backbone.sync('update', @toJSON(), url: @url(), contentType: 'application/json')
.
답은 서버 측에서 수집 작업을 수행하는 방법에 따라 달라집니다.
투고와 함께 추가 데이터를 보내야 하는 경우 래퍼 모델 또는 관계 모델이 필요할 수 있습니다.
래퍼 모델에서는 항상 독자적인 해석 방법을 작성해야 합니다.
var Occupants = Backbone.Collection.extend({
model: Person
});
var House = Backbone.Model.extend({
url: function (){
return "/house/"+this.id;
},
parse: function(response){
response.occupants = new Occupants(response.occupants)
return response;
}
});
관계형 모델이 더 낫다고 생각합니다.왜냐하면 이러한 모델을 보다 쉽게 설정할 수 있고 인크루드(include)로 규제할 수 있기 때문입니다.InJSON 옵션: rest 서비스에 보내는 json에 넣을 속성.
var House = Backbone.RelationalModel.extend({
url: function (){
return "/house/"+this.id;
},
relations: [
{
type: Backbone.HasMany,
key: 'occupants',
relatedModel: Person,
includeInJSON: ["id"],
reverseRelation: {
key: 'livesIn'
}
}
]
});
추가 데이터를 보내지 않으면 컬렉션 자체를 동기화할 수 있습니다.이 경우 컬렉션(또는 컬렉션 프로토타입)에 저장 방법을 추가해야 합니다.
var Occupants = Backbone.Collection.extend({
url: "/concrete-house/occupants",
model: Person,
save: function (options) {
this.sync("update", this, options);
}
});
내가 알고 있는 오래된 실타래는 다음과 같다.
Backbone.Collection.prototype.save = function (options) {
// create a tmp collection, with the changed models, and the url
var tmpCollection = new Backbone.Collection( this.changed() );
tmpCollection.url = this.url;
// sync
Backbone.sync("create", tmpCollection, options);
};
Backbone.Collection.prototype.changed = function (options) {
// return only the changed models.
return this.models.filter( function(m){
return m.hasChanged()
});
};
// and sync the diffs.
self.userCollection.save();
꽤 어색한 전방 :)
Backbone 컬렉션에 세이브 기능이 내장되어 있지 않은 것도 놀랐습니다.여기 그것을 하기 위해 내 백본 컬렉션에 써놓은 것이 있다.컬렉션의 각 모델을 반복하여 개별적으로 저장하고 싶지 않습니다.에서 Node를 하여 Backbone을 의 Backbone을 .Backbone.sync
작은 프로젝트의 플랫 파일에 저장할 수 있지만 코드는 거의 동일해야 합니다.
save: function(){
Backbone.sync('save', this, {
success: function(){
console.log('users saved!');
}
});
}
다음은 간단한 예입니다.
var Books = Backbone.Collection.extend({
model: Book,
url: function() {
return '/books/';
},
save: function(){
Backbone.sync('create', this, {
success: function() {
console.log('Saved!');
}
});
}
});
컬렉션에서 save() 메서드를 호출하면 정의된 URL로 PUT 메서드 요구가 전송됩니다.
저는 다음과 같은 것을 시도합니다.
var CollectionSync = function(method, model, [options]) {
// do similar things to Backbone.sync
}
var MyCollection = Backbone.Collection.extend({
sync: CollectionSync,
model: MyModel,
getChanged: function() {
// return a list of models that have changed by checking hasChanged()
},
save: function(attributes, options) {
// do similar things as Model.save
}
});
( https://stackoverflow.com/a/11085198/137067 )
받아들여진 답변은 매우 좋지만, 한 걸음 더 나아가 청취자에게 적절한 이벤트가 발생하는지 확인하면서 옵션인 ajax 이벤트 콜백을 전달할 수 있는 코드를 제공할 수 있습니다.
save: function( options ) {
var self = this;
var success = options.success;
var error = options.error;
var complete = options.complete;
options.success = function( response, status, xhr ) {
self.trigger('sync', self, response, options);
if (success) return success.apply(this, arguments);
};
options.error = function( response, status, xhr ) {
self.trigger('error', self, response, options);
if (error) return error.apply(this, arguments);
};
options.complete = function( response, status, xhr ) {
if (complete) return complete.apply(this, arguments);
}
Backbone.sync('create', this, options);
}
2017년에도 backbone.js를 사용하고 있는 사람에게는, 받아들여지고 있는 회답이 기능하지 않습니다.
래퍼 모델에서 toJSON() 덮어쓰기를 제거하고 J에 호출해 보십시오.모델 래퍼를 인스턴스화할 때 컬렉션의 SON.
new ModelWrapper(Collection.toJSON());
언급URL : https://stackoverflow.com/questions/6879138/how-to-save-an-entire-collection-in-backbone-js-backbone-sync-or-jquery-ajax
'programing' 카테고리의 다른 글
메인 스레드의 동기 XMLHttpRequest는 더 이상 사용되지 않습니다. (0) | 2023.03.20 |
---|---|
스크래피를 사용한 JSON 응답 스크래핑 (0) | 2023.03.20 |
변수가 null인 경우 표시/숨기는 방법 (0) | 2023.03.20 |
성공/오류/최종/각도로 약속 사용JS (0) | 2023.03.15 |
같은 테이블의 여러 열에 대한 내부 결합 실행 (0) | 2023.03.15 |