2015-11-10 2 views
4

Я хочу создать элемент, который пользователь может создать только один раз.Как создать элемент singleton в Polymer

Пока лучшее, что я могу придумать, это определить элемент внутри анонимной функции и выбросить ошибку, когда я нахожу, что элемент уже существует. Есть ли способ, чтобы он просто отвергал создание?

(function(){ 
    var singleton = false; 
    Polymer({ 
    is:'my-singleton', 
    created:function(){ 
    if(singleton) { 
    throw new Error ('only one my-singleton should be created'); 
    } 
    singleton = this; 
    } 
    }); 
})(); 

ответ

3

Я, кажется, что есть недокументированная remove() функция для элементов. Я только что переместил код ранее в функцию attached и сохранил переменную, которая отмечает, если я активирован или нет.

(function(){ 
    var singleton = false; 
    Polymer({ 
    is:'my-singleton', 
    attached:function(){ 
    if(singleton) { 
    this.isActive = false; 
    this.remove(); 
    } else { 
    singleton = true; 
    this.isActive = true; 
    // remainder of element initialization 
    } 
    }, 
    detached:function() { 
    if(this.isActive) singleton = false; 
    } 
}); 
})(); 

Это, кажется, работает очень хорошо.

+0

Я пытаюсь создать элемент, который может быть создан только один раз, но после того, как элемент ссылается на несколько других элементов. Это то, что вы пытаетесь сделать? Если да, то можете ли вы подробно остановиться на решении, с которым вы столкнулись. –

+0

@DaleSnowdon Это именно то, что делает этот элемент. Он удаляет себя, если он уже существует. Основой созданного мной маршрутизатора, но больше не используемого, см. Https://github.com/akc42/akc-router. Я также использую шаблон, где есть несколько копий элементов, но все они получают доступ к тем же данным. В качестве примера см. Https://github.com/akc42/akc-meta (опять же я не использую больше, поскольку он слишком общий, так как мои общие данные - это, в основном, материал, читаемый из базы данных) – akc42

2

Вы хотите ограничить количество <my-singleton> на странице, или просто «состояние» одиночки?

Для совместного одноплодного состояния/обслуживание между несколькими экземплярами элемента вы можете сделать это:

(function() { 
    'use strict'; 

    // singleton shared connection between all instances of rg-signalr 
    var singletonState = { 
     counter: 0 
    }; 

    Polymer({ 
     is: 'my-element-using-singleton-state', 

     attached() { 
      singletonState.counter++; 
     } 
    }); 
})(); 
+1

Нет, общее состояние легко. Я хочу только один элемент. – akc42

Смежные вопросы