2015-07-22 3 views
2

Я пытаюсь создать сервис в Polymer, но я не понимаю, как я должен создавать статические свойства.Статические свойства в Polymer

Мне нужно, чтобы они использовали одно и то же значение для всех экземпляров («статические»). НО мне также понадобятся наблюдатели, которые будут запускаться в каждом экземпляре, когда они будут обновлены.

Я знаю, что я мог бы создать переменную в объеме полимера() называют так:

var users = []; 
Polymer({ 
    is: 'my-service', 
    properties: { 
    users: { 
     type: Array, 
     value: users, 
     notify: true, 
    } 
    }, 
    // ... 
}); 

Но это не соответствует второму критерию. Если я обновляю его из одного экземпляра, он не вызывает наблюдателей других экземпляров.

Вы знаете, как выполнить это, не запуская наблюдателей на каждом экземпляре вручную? (Я мог бы это сделать, но в этом случае это победит идею использования рамки.)

EDIT: Альтернативой было бы создание одноэлементного, но я не думаю, что это возможно.

ответ

1
<dom-module id="my-service"> 
    <template> 
    <iron-meta id="my-service-users" value="{{users}}"></iron-meta> 
    </template> 
    <script> 
    Polymer({ 
     is: 'my-service', 
     properties: { 
     users: { 
      type: Array, 
      value: function(){return [];}, 
      notify: true 
     } 
     } 
    }); 
    </script> 
</dom-module> 

iron-meta создает одноплодное значение, которое автоматически обновляет значение users во всех случаях, которые также должны вызвать какие-либо соответствующие наблюдатель.

+1

Спасибо за ваш ответ. Я пробовал это обходное решение и даже добавил атрибут key, но наблюдатель ('usersChanged (users, users.splices)') был вызван только для экземпляра, внесшего изменения. Кажется, что мета-значение (полученное с помощью функции byKey (...) 'компонента iron-meta) не обновляется, несмотря на то, что атрибут' value' на одном и том же компоненте iron-meta правильно обновлен. Я что-то упускаю ? – user47066

1

На самом деле довольно просто создать статические свойства с наблюдателями. Проблема, с которой вы сталкиваетесь, представляет собой комбинацию дизайна Polymer и собственной реализации методов Array.prototype.

Наблюдатели массивов и объектов (наблюдатели глубины/пути) работают немного иначе, чем другие наблюдатели за имуществом. Как правило, уведомление будет работать только при изменении экземпляра. Кроме того, большинство объектов Array.prototype.functions возвращают новый экземпляр модифицированного массива ... Итак, когда вы соединяете массив, в значение свойства объекта задается другой экземпляр (а не значение статического свойства) и теперь нет дольше, чем исходный статический массив, который вы установили. Вот почему уведомляется только модифицирующий экземпляр.

Моя единственная рекомендация по преодолению этого: Не использовать Array.prototype.splice(), или this.splice(). Даже если вы сделаете это при статическом свойстве, результатом будет всегда новый массив, вызывающий несоответствующие данные. Отсюда, у вас есть два варианта: использовать set API полимера или удалить индекс и вручную notifyPath()

Вот ссылка, которая обсуждает как:

Data binding - Path change notification

+0

Я не понимаю, где вы говорите, что новый массив создается с помощью splice(). Из того, что я видел, нет нового массива (нет новой ссылки/экземпляра) и как свойства в экземпляре MyService, так и переменной, доступной путем изменения закрытия (поскольку они представляют собой один и тот же массив). Свойство в других экземплярах также изменяется, но они не сообщаются. Я понимаю это поведение и считаю его логичным, но для создания полностью функционального статического свойства мне нужно, чтобы все экземпляры MyService были уведомлены. Тот факт, что splice() не создает новый массив, также предотвращает работу notifyPath(). – user47066

+0

Я знаю, что это лет, но некоторые логики просто не меняются. Заглядывая в Polymer 3 (который в это время ранней бета-версии), и пытался понять логику создания статического геттера для свойств атрибутов, и это сделало все ясным. Спасибо, Fuzzical Logic. (Ваше имя в этом случае несколько иронично ...;)) – Metagrapher

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