programing

컬렉션을 포함한 Backbone.js 모델

newstyles 2023. 3. 20. 21:44

컬렉션을 포함한 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