컬렉션을 포함한 Backbone.js 모델
2개의 모델과 1개의 컬렉션을 가지고 있습니다. JobSummary
모델입니다.JobSummaryList
의 컬렉션입니다.JobSummary
아이템을 가지고 있습니다.JobSummarySnapshot
를 포함한 모델JobSummaryList
:
JobSummary = Backbone.Model.extend({});
JobSummaryList = Backbone.Collection.extend({
model: JobSummary
});
JobSummarySnapshot = Backbone.Model.extend({
url: '/JobSummaryList',
defaults: {
pageNumber: 1,
summaryList: new JobSummaryList()
}
});
내가 전화했을 때fetch
에서JobSummarySnapshot
오브젝트, 모든 것을 얻습니다...내가 이 지역을 지나갈 때 빼고는summaryList
그것들은 모두 종류이다object
가 아니라JobSummary
.
이게 말이 되는 것 같아요.defaults
오브젝트, 이 오브젝트에서는, 이 오브젝트가summaryList
종류여야 한다JobSummaryList
. 각 항목을 검토하여 변환합니다.JobSummary
오브젝트입니다만, 수동으로 할 필요 없이 할 수 있는 방법이 있으면 좋겠다고 생각했습니다.
테스트 코드는 다음과 같습니다(여기서 jsfiddle 작업).
var returnData = {
pageNumber: 3,
summaryList: [
{
id: 5,
name: 'name1'},
{
id: 6,
name: 'name2'}
]
};
var fakeserver = sinon.fakeServer.create();
fakeserver.respondWith('GET', '/JobSummaryList', [200,
{
'Content-Type': 'application/json'},
JSON.stringify(returnData)]);
var callback = sinon.spy();
var summarySnapshot = new JobSummarySnapshot();
summarySnapshot.bind('change', callback);
summarySnapshot.fetch();
fakeserver.respond();
var theReturnedList = callback.getCall(0).args[0].attributes.summaryList;
_.each(theReturnedList, function(item) {
console.log('Original Item: ');
console.log(item instanceof JobSummary); // IS FALSE
var convertedItem = new JobSummary(item);
console.log('converted item: ');
console.log(convertedItem instanceof JobSummary); // IS TRUE
});
업데이트: 구문 분석 기능을 무시하고 이렇게 설정할 수 있다는 생각이 들었습니다.이제 이거 있어요.
JobSummarySnapshot = Backbone.Model.extend({
url: '/JobSummaryList',
defaults: {
pageNumber: 1,
summaryList: new JobSummaryList()
},
parse: function(response) {
this.set({pageNumber: response.pageNumber});
var summaryList = new JobSummaryList();
summaryList.add(response.summaryList);
this.set({summaryList: summaryList});
}
});
아직까지는 통한다.누군가 코멘트를 할 경우를 대비해서 질문을 열어둔다.
당신의.parse()
함수는 안 된다set()
어떤 것이든 속성을 반환하는 것이 좋습니다.백본이 설정을 처리합니다.
parse: function(response) {
response.summaryList = new JobSummaryList(response.summaryList);
return response;
}
네가 뭘에서 돌아오든parse()
에 전달됩니다.
아무것도 반환하지 않음(반환과 같다)undefined
)는, 콜과 같습니다.set(undefined)
이 경우 검증에 합격하지 않거나 커스텀의 경우 예기치 않은 결과가 발생할 수 있습니다.validate()
/set()
메서드는 오브젝트를 취득할 것으로 예상합니다.검증 또는set()
이 때문에 메서드는 실패합니다.options.success
전달된 콜백Backbone.Model#fetch()
호출되지 않습니다.
또, 이것을 보다 범용적으로 하기 위해서set()
(서버 응답뿐만 아니라) 다른 장소에서 일반 오브젝트로의 입력도 영향을 미칩니다.set()
대신:
set: function(attributes, options) {
if (attributes.summaryList !== undefined && !(attributes.summaryList instanceof JobSummaryList)) {
attributes.summaryList = new JobSummaryList(attributes.summaryList);
}
return Backbone.Model.prototype.set.call(this, attributes, options);
}
또한 Backbone-relation-relations는 모델 내부에 중첩된 컬렉션/모델을 훨씬 쉽게 처리할 수 있습니다.
편집 set() 메서드에서 반환하는 것을 잊었습니다.코드가 갱신되었습니다.
언급URL : https://stackoverflow.com/questions/7140741/backbone-js-model-with-collection
'programing' 카테고리의 다른 글
AngularJS: $리소스(솔루션)를 사용하여 파일 업로드 (0) | 2023.03.25 |
---|---|
업로드한 파일의 데이터를 javascript로 가져옵니다. (0) | 2023.03.25 |
임베디드 넷티 서버가 spring-boot-starter-webflux로 시작되지 않도록 하려면 어떻게 해야 합니까? (0) | 2023.03.20 |
Wordpress 이미지 업로드 시간 오류: 이미지 후 처리에 실패했습니다. (0) | 2023.03.20 |
MUI 설치는 React 18에서 작동하지 않습니다. (0) | 2023.03.20 |