2015-05-26 7 views
1

У меня есть основной компонент приложения, который использует компонент login_form, когда отправляется форма входа в систему, я хочу перенаправить страницу домой, используя маршрутизатор.Обмен переменными между компонентами

/main_app/main_app.dart

@CustomTag('main-app') 
class MainApp extends PolymerElement { 
    @observable String route; 

    final Router router = new Router(); 

    MainApp.created() : super.created(); 

    ready() { 
    print('Main App: ready()'); 

    router.root 
     ..addRoute(name: 'home', path: '/', enter: showHome, defaultRoute: true) 
     ..addRoute(name: 'login', path: '/#!/login', enter: showLogin); 

    router.listen(); 
    } 

    void showHome(RouteEvent event) { 
    print("Main App: showHome()"); 

    route = event.route.name; 
    } 

    void showLogin(RouteEvent event) { 
    print("Main App: showLogin()"); 

    route = event.route.name; 
    } 
} 

/login_form/login_form.dart

@CustomTag('login-form') 
class LoginForm extends PolymerElement { 
    @observable String username; 
    @observable String password; 

    LoginForm.created() : super.created(); 

    void submit(Event event, Object detail, Node sender) { 
    // Form submit 
    // Access router here 
    // ie. router.go('home', {}); 
    } 
} 

я нашел решения, такие как использование одноплодной как этот

static final Router _sharedRouter = new Router(); 
static Router get sharedRouter => _router; 

th ru

MainApp.sharedRouter.go('home', {}} 

Есть ли лучший способ сделать это?

ответ

1

Просто создайте привязку от родителя к дочернему элементу:

Добавление поля route к вашему login-form

@CustomTag('login-form') 
class LoginForm extends PolymerElement { 
    ... 
    String route; 

    LoginForm.created() : super.created(); 

    void submit(Event event, Object detail, Node sender) { 
    // Form submit 
    // Access router here 
    // ie. router.go('home', {}); 
    } 
} 

Я предполагаю, что вы разместили свой login-form где-то внутри main-app сек шаблона.

<polymer-element name="main-app"> 
    <template> 
    ... 
    <login-form route="{{route}}"><login-form> 
    ... 
    </template> 
</polymer-element> 

Это должно обновить route поле в LoginForm каждый раз, когда route изменения поля в MainApp.

Если login-form не помещается внутри main-appstemplate вы также можете использовать этот подход https://stackoverflow.com/a/29864797/217408

+1

Благодарит Вас, Логин форма помещаются внутри основных-приложений, но вложенный, главное-приложение компонент -> Логин-PAGE- component -> login-form –

+1

Я вижу, тогда вам нужно будет передать поле «route» каждому дочернему элементу в цепочке. В этом случае подход в глобальном масштабе может быть лучше подходит. То, что вы также можете сделать, - это запустить событие по изменению маршрута, а заинтересованные компоненты прослушать это событие и сохранить последнее полученное значение, переданное с событием. –

+1

Спасибо, я попробую –

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