2015-10-23 2 views
9

В моем приложении я сделал много «сервисов», которые я могу вводить в своих режимах просмотра, чтобы сохранить избыточность и время.2-сторонняя привязка данных в пользовательских элементах Aurelia - привязка настраиваемого элемента к родительской схеме просмотра.

Теперь я ищу еще один шаг и сделаю эти элементы формы (выберите, текст, флажки - выберите раскрывающийся список для стартеров) и превратите их в пользовательские элементы, введя службу только в пользовательский элемент.

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

Я хочу, чтобы иметь возможность привязать мое выбранное значение от пользовательского элемента к свойству в «родительской» модели просмотра через атрибут bind в его шаблоне.

Я расскажу о небольшом фрагменте кода за несколько минут.

create.js (то, что я имею в виду, как родительский ViewModel)

import {bindable} from 'aurelia-framework'; 
export class Create{ 
    heading = 'Create'; 
    @bindable myCustomElementValue = 'initial value'; 
} 

create.html (родительский вид)

<template> 
    <require from="shared/my-custom-element"></require> 
    <my-custom selectedValue.bind="myCustomElementValue"></my-custom> 
    <p>The output of ${myCustomElementValue} should ideally be shown and changed here, as the select dropdown changes</p> 
</template> 

мои-custom.js

import { inject, bindable} from 'aurelia-framework'; 
import MyService from 'my-service'; 

@inject(MyService) 
export class MyCustomCustomElement { 
    @bindable selectedValue; 

    constructor(myService) { 
     this.myService = myService ; 
    } 

    selectedValueChanged(value) { 
     alert(value); 
     this.selectedValue = value; 
    } 

    async attached() { 
     this.allSelectableValues = await this.myService.getAllValues(); 
    } 
} 

Что происходит изначально, представление create.html выводит «начальное значение», и когда я изменяю значение выбранного пользовательского элемента, вновь выбранная оценка e получает предупреждение, но он не обновляет связанную родительскую переменную, которая по-прежнему просто отображает «начальное значение».

ответ

21

Есть несколько вопросов здесь:

  1. Вам нужно Шашлычные случае любые имена свойств в DOM из-за прецедентным нечувствительности

    selected-value.bind="property"

    не

    selectedValue.bind="property"

  2. Вам необходимо связать двусторонний. При создании @bindable с использованием декоратора один из аргументов - BindingMode, который вы используете для установки режима привязки по умолчанию.

    Aurelia устанавливает некоторые разумные значения по умолчанию, например. по умолчанию для input value.bind=".." два путей без явного

    Если вы не хотите, чтобы установить режим привязки по умолчанию, вы можете просто быть явным с вашим обязательным:

    selected-value.two-way="prop"

Надеется, что это помогает :)

Редактировать: Я думаю, что API немного изменился после этого ответа.

@bindable декоратор имеет следующий сиговых:

bindable({ 
    name:'myProperty', 
    attribute:'my-property', 
    changeHandler:'myPropertyChanged', 
    defaultBindingMode: bindingMode.oneWay, 
    defaultValue: undefined 
}) 

Один из лучших мест, чтобы проверить для быстрой ссылки является Aurelia чит-лист в документации:

http://aurelia.io/docs/fundamentals/cheat-sheet

+0

Вау спасибо много. Какой замечательный ответ. На самом деле вещь змеиного дела была просто опечаткой в ​​образце кода, но .two-way все это изменило! : D Могу ли я спросить вас, что вы предпочитаете - декоратор или два пути? – Dac0d3r

+2

Вы должны установить режим привязки по умолчанию к тому, что ожидали бы другие люди (или вы сами). Я бы сказал, что в этом примере по умолчанию задано значение «по два пути», так как это наиболее естественное использование вашего элемента управления - вы почти всегда хотите, чтобы «selected-value» связывал двусторонний. Именно так Aurelia использует условные обозначения, и он работает хорошо. – Charleh

+0

+1 и спасибо за упоминание змеиной оболочки. Я не видел, чтобы это упоминалось в документах, так как в качестве примера были одни переменные слов. Сумасшедший, пытаясь выяснить привязку, не работал, когда это было сделано просто так же, как и другие. – Danomite

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

  • Нет связанных вопросов^_^