2016-01-08 2 views
1

Рассмотрим следующий пример и обратите внимание на функцию setActive в app-bar.js.Шаблон против класса в Aurelia

Теперь, как он стоит, если я нажму Home или Plan из app-bar.html, то activeTab свойства в app.js обновляется соответствующим образом. Однако, если я нажму на среднюю кнопку, которая вызывает вышеупомянутую функцию, я получаю следующую ошибку: Uncaught ReferenceError: activeTab is not defined. Более того, если я изменю установщик на this.activeTab = newTab, ошибка не будет сброшена, но значение не будет привязано к activeTab в app.js

Что здесь происходит? Почему шаблон DOM является единственной частью моего компонента, которая может видеть/взаимодействовать с activeTab? Я пропустил необходимый синтаксис в своем классе? Если да, просьба предоставить документацию.

Я некоторое время стучал головой на свой стол, и по прихоти я принял решение поставить activeTab = 'Home' на сам click.trigger, и он волшебным образом работает, но я не понимаю, почему. Мне не нравится идея обновления значений модели в шаблоне, поэтому я хотел бы передать это событие JS и обновить модель, но, как видим, она не работает.

Дайте мне знать, если вам нужна дополнительная информация.

app.js

export class App { 
    activeTab = 'Home'; 
} 

app.html

<template> 
    <require from="app-bar"></require> 
    <h4>ActiveTab via App.js: ${activeTab}</h4> 
    <app-bar></app-bar> 
</template> 

АПП-bar.js

export class AppBar { 
    setActiveTab(newTab) { 
     activeTab = newTab; 
    } 
} 

приложение-bar.html

<template> 
    <button click.trigger="activeTab = 'Home'">Home</button> 
    <button click.trigger="setActiveTab('Assess')">Assess</button> 
    <button click.trigger="activeTab = 'Plan'">Plan</button> 
</template> 

enter image description here

+0

У меня нет места, чтобы проверить это, но это работает, если вы измените его 'this.activeTab = newTab;'? – tcigrand

+0

@tcigrand Это не так, я упомянул об этом в последнем предложении второго абзаца. Так что в тупике! – lux

+1

Хорошо. Похоже, что у вас есть некоторые проблемы с объемом каждого компонента. AppBar не может видеть приложение. Вы должны передать значение activeTab приложения в AppBar. Вы должны иметь возможность следовать разделу «Пользовательские элементы» на странице http://aurelia.io/docs.html#/aurelia/framework/1.0.0-beta.1.0.7/doc/article/cheat-sheet – tcigrand

ответ

2

Проблема здесь:

export class AppBar { 
    setActiveTab(newTab) { 
     activeTab = newTab; // <---- what is `activeTab`? It's not defined anywhere! 
    } 
} 

Вы, вероятно, хотите сделать что-то вроде этого:

приложение-bar.js

import {bindable, bindingMode} from 'aurelia-framework'; 

export class AppBar { 
    @bindable({ defaultBindingMode: bindingMode.twoWay }) activeTab; 

    setActiveTab(newTab) { 
     this.activeTab = newTab; 
    } 
} 

app.html

<template> 
    <require from="app-bar"></require> 
    <h4>ActiveTab via App.js: ${activeTab}</h4> 
    <app-bar active-tab.bind="activeTab"></app-bar> 
</template> 
+0

Спасибо, я знал, что это было в этих строках.И кажется, что 'app-bar' способен прототипно наследовать' activeTab' из 'app', не указывая его как атрибут компонента, что было бы полезно, если бы мне не пришлось связывать резервное копирование дерева. Очень похоже на угловые области, если это так, но отличается от концепции React's 'this.props.activeTab'. Если я хочу привязываться к' app', похоже, мне понадобится 'active-tab .bind'. (Наряду с необходимым импортом в самом классе) У меня есть это правильно? – lux

+0

Просто отслеживание - похоже, проблема, с которой я столкнулся с шаблонами, наследующими без привязки, - это регрессия: https://twitter.com/AureliaEffect/status/686662742086828032 – lux

+0

oh man- Я забыл опубликовать обновление здесь. запустите свою проблему командой - это определенно ошибка, мы работаем над исправлением: https://github.com/aurelia/templating/pull/244 должен быть выпущен в ближайшее время! –