2014-10-14 2 views
7

두 개의 뷰 (폴리머 요소)가 예를 들어 모델을 공유하기를 원한다고합니다.MV * 중합체, 모델 및 서비스에서 중합체 요소?

Angular에서 모델은 동일한 소스에서 읽은 두보기 모두보기로 주입되는 싱글 톤 서비스에서 살 것입니다.

나는 내가 뭔가를 할 수있는 고분자이 접근 방식을 모방하려고 : 그것은 종속성을 정의하는 선언적인 방법, 그리고 기본적으로 밖으로 " <core-ajax> 및 기타와 동일하게 작동하기 때문에

<polymer-element name="view1"> 
    <template> 
    <my-model></my-model> 
    ... 
    </template> 
    ... 
</polymer-element> 

<polymer-element name="view2"> 
    <template> 
    <my-model></my-model> 
    ... 
    </template> 
    ... 
</polymer-element> 

나는이 방법을 좋아한다 상자의 "고분자 요소.

이 방법을 사용하면 템플릿에 선언 된 요소와 인터페이스하기 전에 domReady 라이프 사이클 콜백을 기다려야하므로 여기에 초 기 초기화 논리가 있습니다. 문제는이 콜백이 각 <my-model> 요소에 대해 한 번 호출된다는 것입니다 (따라서 <my-model><view1><view2>에 모두 있기 때문에이 예제에서는 두 번 초기화됩니다). 내 모델 나는이 같은 요소 인스턴스의 외부 뭔가를 상태를 이동해야 싱글 톤 패턴은 다음과 있는지 확인하십시오 :

<polymer-element name="my-model"> 
    <script> 
    (function(){ 
     // private shared state 
     var instances = [], registered; // pattern variables 
     var foo; // state, model, whatever 

     // element init logic 
     Polymer('my-model', { 
     // Polymer callbacks 
     domReady: function(){ 
      if (registered === (registered=true)) return; 
      // singleton init logic 
      foo = 'something'; 
      // event handlers 
      this.addEventListener('foo', function(){ foo += 'baz'; }); 
     }, 
     attached: function() { instances.push(this); }, 
     detached: function(){ 
      instances = instances.filter(function(instance){ 
      return instance !== this; 
      }.bind(this)); 
     }, 
     // element API 
     update: doSomething, 
     get state() { return foo; } 
     }); 
     // private functions 
     function doSomething(){ foo += 'bar' } 
    })(); 
    </script> 
</polymer-element> 

그래서 작동을하지만 나에게 잘못 보인다. <polymer-element>을 사용하는 것이 일반적으로 싱글 톤 패턴과 호환되지 않습니까? 모델과 서비스를 위해 Polymer에서 벗어나야합니까? 폴리머 핵심 요소는 어떻게 제거됩니까?

[편집] 위의 초기화 코드에 이벤트 리스너를 추가했습니다. 여러 인스턴스에서 여러 번 트리거되는 리스너를 피하기 위해 하나의 인스턴스에만 등록됩니다. 이벤트 처리기가 선언 된 인스턴스가 제거되면 어떻게됩니까? 비동기 논리를 깨지 않을 것입니까?

+3

:

또 다른 방법은 폴리머 코어 메타 요소를 사용하는 것입니다. https://www.polymer-project.org/docs/polymer/polymer.html#global – ebidel

+0

이벤트 리스너가 특정 인스턴스에 등록되고 나중에 해당 인스턴스가 제거되면 어떻게됩니까? 다른 인스턴스가 잘리지 않습니까? – Renaud

답변

1

다음과 같이 지정하십시오.
기본 페이지에서 모델을 정의하고보기에서 호출하십시오.

그것을 제거됩니다 경우 수 :
- 1 "분리 된"라이프 사이클 콜백과는 불가피을 등록하거나 내부 듣고
2 - 프로토 타입 높은 수준의 객체에서 빌드 및 액세스 그것을 스토어 물건 당신이 가장 좋아하는 방법.
3 - 모두 실패하면 (아직 확신 할 수 없지만 아직이 종류의 구현을 사용하지 않았으므로 현재 PHP에 대해 이야기하고 영구 객체가 필요합니다) 사용할 수 있습니다. "prepareForRemoval"당신이 인스턴스를 떠날 것임을 알면서, 로컬 저장소에 물건을 저장하고 번호 1을 수행하십시오. "recoverFromRemoval" 낙타 케이싱 프로토 타입 제안의 의미가 무엇인지 아는 경우 .

어쨌든 나는 싱글 톤을별로 좋아하지 않습니다. Polymer는 강력한 프론트 엔드 제품이지만, 최선의 방법이라고 확신하지 못합니다.

API 문서에서는 차단 가능성 (as you can see) 을 언급하지는 않지만 솔직히 말해서 내가 맞다고 생각하고 물건을 잃어 버릴 것입니다.
그건 그냥 내 2 센트 야. 사실이 순간에 내게 , 어쩌면 @ebidel, @DocDude 또는 @dodson이 도움이 될 수 있지만 실제로는 여기에 태그 할 수 없다. G +에서 우리에게 태그를 붙이면 당신은 나를 흥미롭게 만든다.
왜 주 페이지에서 벗어나려고합니까? 당신이 동적으로 내용을 바꿔서는 안되는 폴리머에 대해서는 아무런 의미가 없습니다. 사용 시나리오는 무엇입니까?


ps : 죄송합니다. 적절한 명사를 대문자로 사용하지 마십시오.

EDIT (주석에 맞지 않는 것)을 통해 얻을 :

내가 자신을 잘못 표현했다. 어쨌든 나는 당신이 원하는 것을 이해하지 못한다고 강력하게 생각합니다.
글쎄, 이번에는 네가 여러 번 발사 할거예요.하지만 특정 뷰가 제거되면 다른 사람들을 잘라서는 안됩니다.

당신의 초기화 논리에 관해서는 나는 '폴리머 준비 (polymer-ready)'이벤트를 기다리는 창이나 문서 (나는 윈도우가 더 적당하다고 생각한다)에 리스너를 추가하려고한다.

예 그게 바로 "내 모델은 내가 요소 인스턴스의 외부 이동 상태에있는 싱글 톤 패턴을 따른다 있는지 확인하십시오." 그러나 prototype에서 domready를 기다리지 말고, 대신 construct를 사용하거나 contruct-like를 사용하여 앞서 언급 한 이벤트 리스너의 콜백으로 호출하십시오. 집에 돌아갈 때 대답을 더 명확하게 편집 할 것입니다 (그렇지 않다면 알려주세요).
나는 당신이 의미하는 바램이 있기를 바랍니다.

내가 곧 다시 방문 할 예정입니다.

+0

전 메인 페이지에서 멀어지는 것이 아닙니다. 뷰를 통해 폴리머 요소를 의미합니다. 이러한 요소는 대개 기본 페이지에 공존하며 일부는 숨겨져있을 수 있지만 그게 전부입니다. 메인 페이지에서 직접 모델을 정의하는 경우 메인 페이지가 뷰를 가져와야하므로 원형 의존성이 생성되고 뷰는 메인 페이지를 반입해야합니다. 다른 방법으로 뷰에서 모델에 대한 핸들을 얻는 방법은 무엇입니까? – Renaud

+0

이 댓글에 적합하지 않기 때문에 내 답변이 수정되었습니다. 너 내가 한 짓을 안다면 알아라. –

0

브라우저에서 window == singleton object 정의에 따라. 간단한 사용 :

var window.instances = []; 
var window.registered; 
var window.foo; 

대신에. 이것은 여러 인스턴스를 통해 상태를 공유 필요가 요소에 대해, 어느 정도 패턴 우리가 추천입니다

<core-meta id="x-foo" label="foo"></core-meta> 
    <core-meta id="x-bar" label="bar"></core-meta> 
    <core-meta id="x-zot" label="zot"></core-meta> 

    <core-meta id="apple" label="apple" type="fruit"></core-meta> 
    <core-meta id="orange" label="orange" type="fruit"></core-meta> 
    <core-meta id="grape" label="grape" type="fruit"></core-meta> 

    <h2>meta-data</h2> 

    <template id="default" repeat="{{metadata}}"> 
    <div>{{label}}</div> 
    </template> 

    <h2>meta-data (type: fruit)</h2> 

    <template id="fruit" repeat="{{metadata}}"> 
    <div>{{label}}</div> 
    </template> 

    <script> 

    document.addEventListener('polymer-ready', function() { 
     var meta = document.createElement('core-meta'); 
     document.querySelector('template#default').model = { 
     metadata: meta.list 
     }; 

     var fruitMeta = document.createElement('core-meta'); 
     fruitMeta.type = 'fruit'; 
     document.querySelector('template#fruit').model = { 
     metadata: fruitMeta.list 
     }; 
    }); 

    </script> 
관련 문제