2

순환 종속성 문제를 일으키는 상당히 복잡한 데이터 모델이 있으므로 최근에 Backbone 및 Require JS에 문제가 발생했습니다. 자기 참조. 나는 많은 게시물을 온라인으로 읽었다. (그 중 실제로는 효과가 없었다.) 그러나 나는 해결책을 찾았다 고 생각한다. 따라서이 문제를 경험 한 사람을 도울 수 있기를 희망하며, 정리할 방법이 있다고 생각하는지 물어보십시오.백본 js + js + 백본 관계형 + 순환 종속성 + 자체 참조 필요

첫 번째 문제점은 컬렉션을 참조하는 모델을 참조하는 모델이 있었는데, 컬렉션을 참조하는 모델이 모두 하나의 큰 순환 의존성을 만들었습니다. 이것은 솔직히 응용 프로그램을 파기했습니다. 여기 사이비 코드 예제입니다

Model A 
    has Collection B 

Collection B 
    of Model B 

Model B 
    has Collection A 
    has Collection C 

Collection A 
    of Model A 

Collection C 
    of Model C 

백본이 같은 일을 수행하여 가능하다는 것을 docs 상태 : 나는 우리의 필요하지만, 우리의 복잡한 중첩 요구 사항이 해결의 다양한 방법을 시도

initialize: function() { 
    this.messages = new Messages; 
    this.messages.url = '/mailbox/' + this.id + '/messages'; 
    this.messages.on("reset", this.updateCounts); 
    }, 

백본에서 지옥을 벗어 버려라. 그래서 backbone relational을 우연히 발견하고 데이터 모델의 기본 작업 표현을 만들었습니다.이 작업은 Require JS로 작업 할 심을 만드는 작업과 관련이 있습니다. 본질적으로 이것이 효과가있었습니다. 그래서 모델 C가 Collection C (자체 참조)의 인스턴스를 가질 수 있도록 예제를 확장했습니다. 다시 이것은 이것이 작동하는 것처럼 보였다. 우수한. 하지만 모델과 컬렉션을 개별 파일로 분리하는 것은 백본 관계형이 컬렉션과 모델 이름이 전역 네임 스페이스에 있어야하기 때문에 어렵습니다. (Require와 "strict strict"로 약간 까다 롭습니다.) . 우리의 복잡한 데이터 모델 때문에 나는 명시적인 참조가 아닌 전방 참조를위한 문자열 식별자를 사용하여 관계를 나타 내기를 원했고 이것은 또한 어려운 것으로 판명되었습니다. 나는 모든 것을 export 네임 스페이스에 추가하려고했지만 다시는 작동하지 않았다. 어쨌든 나는 컬렉션과 모델을 커스텀 네임 스페이스에 추가 한 다음이 네임 스페이스를 backbonerelational 모델 범위에 추가함으로써 해결책을 찾았다 고 생각한다. 나는 나의 커스텀 라이브러리 "Orca"(킬러 고래가 솔직히 끔찍한 이유)라는 이름을지었습니다.

bootstrap.js

require.config({ 
    paths: { 
    "jquery"  : "../bower_components/jquery/jquery", 
    "underscore" : "../bower_components/underscore-amd/underscore", 
    "backbone"  : "../bower_components/backbone-amd/backbone", 
    "relational" : "../bower_components/backbone-relational/backbone-relational", 
    ... 

    shim: { 
    "underscore": { 
     exports: "_" 
    }, 
    "backbone": { 
     deps: ["underscore", "jquery"], 
     exports: "Backbone" 
    }, 
    "relational": { 
     deps: ["backbone"] 
    }, 
    ... 

은/

define(["backbone", "relational", "libs/orca", "collections/a", "models/a", "collections/b", "models/b", "collections/c", "models/c"], function(Backbone, Relational, Orca){ 
    "use strict"; 

    var App = function(options) { 
    this.initialize(otions); 
    }; 

    App.prototype = _.extend(Backbone.Events, { 

    initialize: function(options) { 
     Orca.initialize(); 

     var a = new Orca.Relational.ModelA([],{}); 
    } 
    } 

    return App; 
}); 

lib 디렉토리/orca.js

define(["backbone", "relational"], function(Backbone) { 
    "use strict"; 

    var Orca = { 
    Relational: {}, 

    initialize: function() { 
     Backbone.Relational.store.addModelScope(this.Relational);  
    } 
    }; 

    // I actually extend Backbone.RelationalModel so I can have custom methods, 
    // e.g. "parse" but I've simplified the code for example's sake... 
    Orca.Model = Backbone.RelationalModel; 
    Orca.Collection = Backbone.Collection; 

    return Orca; 
}); 

컬렉션을 app.js

define(["backbone", "libs/orca"], function(Backbone, Orca) { 
    "use strict"; 

    Orca.Relational.CollectionA = Backbone.Collection.extend({}); 
}); 
을 a.js

모델/CollectionB 및 ModelB이 유사

define(["backbone", "libs/orca"], function(Backbone, Orca) { 
    "use strict"; 

    Orca.Relational.ModelA = Orca.Model.extend({ 
    relations: [ 
     { 
     type: Backbone.HasMany, 
     key: "bs", 
     relatedModel: "ModelB", 
     includeInJSON: Backbone.Model.prototype.idAttribute, 
     collectionType: "CollectionB", 
     reverseRelation: { 
      key: "a" 
     } 
     } 
    ] 
    }); 
}); 

그래서 난 간결이 생략했습니다 a.js.

자기 참조를 보여주기 위해 :
define(["backbone", "libs/orca"], function(Backbone, Orca) { 
    "use strict"; 

    Orca.Relational.ModelC = Orca.Model.extend({ 
    relations: [ 
     { 
     type: Backbone.HasMany, 
     key: "cs", 
     relatedModel: "ModelC", 
     includeInJSON: Backbone.Model.prototype.idAttribute, 
     collectionType: "CollectionC", 
     reverseRelation: { 
      key: "c" 
     } 
     } 
    ] 
    }); 
}); 

그래서이 코드에 대한 내 버그 베어는 app.js에 내가 MODELA의 새 인스턴스를 만들 것입니다. 그러나 이것이 CollectionB를 참조하기 때문에 ModelB가 Collection C를 참조하고 Model C를 사용하므로이 모든 것을 필요 종속성으로 참조해야합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

+0

은 아마도 "창"을 컬렉션과 모델을 추가하는 객체가 부정 할 수

내 relational.js 파일은 다음과 같은 비트가 보인다 사용자 지정 개체가 필요하지만 어쨌든 전역 개체에서 물건을 유지하는 아이디어가 마음에 들었습니다. –

답변

0

Backbone Associations을 언급 한 적이 있습니까?한 번만 보시길 권합니다.

내가 그것을 사용했을 때, 나는 비슷한 순환 의존성과 자기 참조 문제에 직면했다. 그 이유는 클라이언트 측의 ModelsHibernate을 사용하여 Tables에 매핑 된 백엔드의 Beans에 매핑했기 때문입니다. one-to-many 관계를 Hibernate에 지정할 때 하나의 엔티티에 대한 참조를 다른 엔티티에 지정하거나 그 반대의 경우도 지정해야합니다. 그런 다음이 엔티티가 Jersey 서비스에 의해 반환 될 때 JSON으로의 변환은 순환 종속성을가집니다. some annotations을 사용하여 백엔드 쪽에서 제거 할 수 있습니다. 그러나 Backbone 쪽에서 해결할 방법이 없습니다. 나는 Backbone Associations의 저자와 함께이 문제를 제기하고 그것을 고쳤다.

희망 사항은 일부 또는 다른 방식으로 도움이되기를 바랍니다.

+0

의견을 보내 주심과 다른 라이브러리를 제안 해 주셔서 감사합니다. –

1

실제로는 백본 관계형 사용을 중단했으며 이제는 다 대다 관계가 허용되므로 JJRelational을 사용하고 있습니다. 또한 컬렉션과 모델을 참조하고 객체의 속성으로 반환하는 "relational.js"라는 새 파일을 만들어 내 기본 응용 프로그램 파일 내에서 컬렉션과 모델을 참조해야 할 필요성을 부인했습니다. 그런 식으로 새로운 모델이나 컬렉션이 필요한 경우에만 "relational.js"를 요구하면됩니다.

define([ 
    // Models 
    "models/broadcast", 
    "models/version", 
    // Collections 
    "collections/broadcasts", 
    "collections/versions" 

], function(
    // Models 
    Broadcast, 
    Version, 
    // Collections 
    Broadcasts, 
    Versions 
) { 
    "use strict"; 

    var _relational = { 
    Broadcast: Broadcast, 
    Version: Version, 

    Broadcasts: Broadcasts, 
    Versions: Versions, 
    }; 

    // Register the Collections 
    Backbone.JJRelational.registerCollectionTypes({ 
    "Broadcasts": _relational.Broadcasts, 
    "Versions": _relational.Versions  
    }); 

    // Provide JJRelational with model scope - pull request submitted to JJRelational to handle this 
    Backbone.JJStore.addModelScope(_relational); 

    return _relational; 
}); 

그런 다음 내 주요 app.js에 :

define(["libs/relational"], function(Relational){ 
    var broadcast = new Relational.Broadcast(); 
});