Как я могу получить значение, которое находится внутри тега HTML и связать его с TS (файл компонента) в Aurelia
Я хочу манипулировать текстом внутри абзаца и получить его контекст для компонента, где я могу манипулировать им. В основном я хочу сделать это:
HTML-файл
<p bind="text"> Some text here </p>
Машинописный файл
export class Example{
@bindable text;
constructor()
{
this.Function()
}
Function() {
console.log(text)
//Here i want to be printed out Some text here
}
}
Я не против, если ответ будет написан в jQuery или в JavaScript.
3 ответа
Принятый ответ действительно НЕ путь. Вы должны просто сделать:
<template>
<p>${text}</p>
</template>
- привязка к
innerhtml
без санитарии это дегенеративно. - дополнительный и дополнительный код.
- имея представление о
DOM
внутриVM
противоречитMVVM
парадигма.
Я рекомендую рассмотреть возможность использования пользовательских атрибутов или манипулирования с использованием ref
- но все же это может быть плохой практикой (JQuery/Angular) манипулирования DOM напрямую.
- Делайте манипуляции с DOM в bind(), attach () или в других методах жизненного цикла компонента, не делайте этого в конструкторе.
- использование
ref
атрибут для доступа к элементу в классе VM. - использовать например
MybindCustomAttribute
определить пользовательский атрибутmybind
и напиши это вmybind.js
файл. Тогда содержание атрибута достижимо черезvalueChanged()
метод. Не использоватьbind
в качестве имени атрибута - как это ни странно.
app.html:
<template>
<require from='./mybind'></require>
<p ref="myparagraph" mybind="Add other text. ">Some text here. </p>
</template>
app.js, обратите внимание, что ManagedContent() добавляет некоторый контент в ваш компонент:
export class App {
constructor() { }
attached() {
this.mytext = this.myparagraph.innerHTML;
this.manipulatecontent();
}
manipulatecontent() {
this.mytext += 'Hello world.';
this.myparagraph.innerHTML=this.mytext
}
}
mybind.js, с настраиваемым классом атрибута в соответствии с соглашением Aurelia. Вы получаете доступ к значению атрибута в методе valueChanged():
export class MybindCustomAttribute {
static inject = [Element];
constructor(element){
this.element = element;
}
valueChanged(newValue, oldValue){
this.element.innerHTML += newValue;
}
}
Поиграйте с GistRun по адресу https://gist.run/?id=b712431087519a20d1a29c88906b7fe9
Этот ответ не верен, хотя он работает. Смотрите принятый ответ для лучшей интеграции и объяснения.
Я никогда раньше не работал с aurelia, но, глядя на документацию, это должно сработать:
Шаблон:
<template>
<p ref="myParagraph" innerhtml.bind="text"></p>
</template>
Составная часть:
export class ExampleComponent {
text = 'Example text';
constructor() {
this.exampleFunction();
}
exampleFunction () {
console.log(text);
// text should be here
}
}
Если вам нужно сначала прочитать текст (он уже задан где-то еще, а не в компоненте), вам может понадобиться прочитать значение в конструкторе.
constructor() {
this.text = this.myParagraph.innerHTML;
}