2014-11-12 3 views
1

그래서 각도 애플 리케이션에 트리 헬퍼 객체가있어 많은 트리 구조를 다루는 유용한 기능을 제공합니다. 이는 공장에서 제공하는, 그래서 일부 컨트롤러 (또는 무엇이든)는 나무 도우미를 요구 때마다, 그것은 자신의 복사본을 얻을 수있다 :자바 스크립트/각도로 객체 확장하기

angular.module('MainApp').factory('TreeHelperFactory', 
function ($http, $q, $filter, DataService) { 
    var treeHelper = new function ($http, $q, $filter, DataService) { 
    ... 
    code 
    ... 
}) 

지금 내가 포함한 다양한 카테고리 관련 기능을 제공하는 카테고리 서비스가를 카테고리 트리를 반환하고 해당 트리를 조작 할 수있는 방법을 제공합니다. OO 개발자처럼 생각하면 카테고리 서비스는 정말 내 트리 도우미의 하위 클래스와 비슷하다고 생각합니다. 따라서 트리 도우미 인스턴스를 삽입 한 다음 카테고리 별 함수로 해당 인스턴스를 확장하려고합니다.

angular.module('MainApp').provider('CategoryService', 
function() { 
    this.$get = function ($http, $q, $filter, DataService, TreeHelperFactory) { 
     var catService = TreeHelperFactory; 
     catService.listCategories = function() {...} 
     catService.deleteCategory = function(id) {...} 
     ... more code... 
     return catService; 
     } 
    } 
); 

하지만 작동하지 않습니다. 나중에 새 속성을 호출하려고하면 새 속성이 표시되지 않고 원래 팩토리 개체의 트리 도우미 속성 만 표시됩니다. 나는 무엇을 놓치고 이것을 어떻게 성취합니까?

답변

0

각도 서비스에 의존하는 도우미는 나에게 나쁜 냄새입니다. 즉, 상태가 도우미 이상이며 서비스가 두 개 있습니다. 그들의 역할과 책임을 구조 조정함으로써 이것을 다시 생각해 볼 수 있습니까?

+0

"도우미"는 제가 생각해 낼 수있는 가장 좋은 단어입니다.하지만 실제로 의미하는 것은 데이터를 저장할 필요가 있기 때문에 특정 기능을 제공하고 * 싱글 톤이 아닌 주사 가능한 개체입니다. 기본적으로 확장 할 수있는 클래스입니다. –

1

angular.js의 서비스는 싱글 톤이므로 서비스를 삽입 할 때마다 동일한 동일한 객체를 반환하므로 삽입 할 때마다 새로운 객체를 반환 할 수 없습니다. ,

angular.module('MainApp') 

.factory('TreeHelperFactory', 
function ($http, $q, $filter, DataService) { 

    /** 
    * TreeHelper constructor 
    * @class  
    */ 
    function TreeHelper() { /* this.init(); */ } 

    /** 
    * TreeHelper static class method 
    */ 
    TreeHelper.list = function() { /* ... */ }; 

    /** 
    * TreeHelper instance method 
    */ 
    TreeHelper.prototype.init = function() { /*...*/ }; 

    /** 
    * Returns the class 
    */ 
    return TreeHelper; 
}) 

지금 당신이 그것을 주입 할 수있는 개체를 인스턴스화과 같이 그것을 확장 :

.factory('CategoryService', function (TreeHelperFactory) { 

    var catService = new TreeHelperFactory(); 

    catService.listCategories = function() { /*...*/ }; 
    catService.deleteCategory = function(id) { /*...*/ }; 

    return catService; 
}); 

할 수있는 일

는 예를 들어, Class 기능을 만드는 것입니다 javascript prototypical inheritance도 사용할 수 있지만 대부분의 경우 과도하다고 생각합니다. 가능한 경우 간단하게 유지하십시오.

+0

감사합니다. 저는 서비스가 싱글 톤이라는 것을 알고 있었지만, 공장에 관한 문서를 읽었을 때 나는 그들이 반환 한 것에 대한 확신이 없었습니다. 위의 방법을 시도해보고 그 일을하는지 봅시다. –