2016-07-25 3 views
1

Чтобы использовать библиотеку, мне нужно иметь возможность привязываться к атрибуту «для» элемента UL.Связывание с произвольными или нестандартными атрибутами в Aurelia

Это не работает:

<ul for="${id}"> ... </ul> 

на основе тестирования Я полагаю, это потому, что ul элементы обычно не имеют атрибут for. Как мне обойти это? Это было тривиальным в Дюрандаль/нокаута, который я считал что-то вроде:

data-bind="attr: { for: $data.id }"

ли я на самом деле нужно создать пользовательский атрибут? Это противоречит встроенному атрибуту, используемому для label? Любое другое очевидное обходное решение?

+0

Нет - это требование библиотеки, поэтому оно должно быть «для» https://getmdl.io/components/index.html#menus-section –

+0

Это полезно, но я не знаю, я действительно покупаю рассуждения. Существует много действительных атрибутов aurelia, которые вы можете иметь, которые не являются «стандартными» для элемента UL. Я думаю, что должен быть включен простой способ привязки к произвольным атрибутам, точно так же, как он был включен в durandal/knockout. –

+0

Я думаю, что это может быть поддержано. Откройте билет в реплике с привязкой к шаблонам, и кто-то должен вернуться к вам с предложениями для PR. –

ответ

3

Aurelia абсолютно поддерживает связывание с Ad-Hoc/произвольных свойств на DOM элемента ,

Когда вы пишете <ul for="${id}"> ... </ul> Aurelia собирается присвоить значение свойства id специальному объявлению на элементе ul.

Это эквивалент ul.for = id или ul['for'] = id.

Части вы упускаете это установку произвольного свойства на элементе DOM не автомагический создать соответствующую HTML атрибута. Другими словами, существует разница между ul.for = id и ul.setAttribute('for', id). Это легко забыть, потому что мы обычно работаем со стандартными атрибутами html, а DOM имеет специальную логику, чтобы отразить значение атрибута HTML с соответствующим свойством DOM. Эта специальная логика не существует для любых свойств, которые вы могли бы добавить в свой код/​​привязки.

Вы можете заставить связывание использовать setAttribute вместо стандартного поведения путем создания обязательного поведения:

https://gist.run/?id=feedfd7659d90c0bdf6d617a244288a6

установку атрибута.JS

import {DataAttributeObserver} from 'aurelia-binding'; 

export class SetAttributeBindingBehavior { 
    bind(binding, source) { 
    binding.targetObserver = new DataAttributeObserver(binding.target, binding.targetProperty); 
    } 

    unbind(binding, source) {} 
} 

использование:

<template> 
    <require from="./set-attribute"></require> 

    <ul for.bind="id & setAttribute"></ul> 

    <ul for="${id & setAttribute}"></ul> 
</template> 

EDIT

Aurelia теперь поставляется с обязательным поведением attr. Используйте <ul for="id & attr">. Вот обновленный пример: https://gist.run/?id=5a12f928d66b6d92c592feb6a62940ad

+0

Это похоже на лучшее решение, чем мое, размещенное ниже, так как оно может работать и для других атрибутов, однако я все еще думаю, что это очень неудовлетворительно. Когда я делаю 'id.bind =" id ", он устанавливает атрибут id. Когда я делаю 'data-foo.bind =" id ", он устанавливает атрибут data-foo. Удивительно и неинтуитивно, что поведение по умолчанию здесь заключается в том, чтобы установить свойство на элемент DOM, который даже не существует. Кроме того, DataAttributeObserver не находится в документах или даже файле aurelia-binding.d.ts. Я все еще верю, что aurelia нуждается в лучшем, готовом для этого решении. –

+0

'id' является встроенным. Используете ли вы 'setAttribute (id, ...)' или 'el.id = ...', DOM будет синхронизировать значение атрибута и значение свойства. Рассматривая это очень узко, имея в виду только ваш случай использования, может показаться, что текущее поведение нежелательно. Для других случаев использования последствия для вызова функции setAttribute без каких-либо причин были бы разблокирующими. Я согласен, что должно быть больше документов. Никогда не больно иметь больше документов. DOM может ввести в заблуждение. Например, сохраняя свой атрибут 'for', но используя вместо этого элемент'

+0

Я вижу. Я полагаю, что данные - * работают так же, как id? Возможно, будет полезен какой-то синтаксис attr.bind или аналогичный. –

0

В итоге я создал атрибут для этого.

export class MdlForCustomAttribute { 
    static inject = [Element]; 

    element : HTMLElement; 
    constructor(element) { 
     this.element = element; 
    } 

    valueChanged(newValue, oldValue) { 
     this.element.setAttribute('for', newValue); 
    } 
} 

Использование:

<ul mdl-for.bind="id">...</ul>

Такой сценарий может поддерживаться в будущих версиях: https://github.com/aurelia/templating-binding/issues/94