İfade dili, gönderilen etkinlikleri işleyen ifadeler yazmanıza olanak tanır görüntüleme sayısına göre Veri Bağlama Kitaplığı, gerekli sınıfları otomatik olarak oluşturur kullanarak düzendeki görünümleri veri nesnelerinize bağlayabilirsiniz.
Veri bağlama düzen dosyaları biraz farklıdır ve şu kök etiketiyle başlar:
layout
ve ardından bir data
öğesi ve bir view
kök öğesi. Bu görünüm
öğesi, bağlayıcı olmayan bir düzen dosyasında kökünüzün bulunduğu öğedir. Aşağıdaki kod
, örnek bir düzen dosyası gösterir:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
data
içindeki user
değişkeni,
şu düzeni kullanın:
<variable name="user" type="com.example.User" />
Düzen içindeki ifadeler özellik özelliklerinde
@{}
söz dizimi. Aşağıdaki örnekte,
TextView
metni şuna ayarlandı:
user
değişkeninin firstName
özelliği:
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}" />
Veri nesneleri
User
varlığını tanımlayacak düz bir nesneniz olduğunu varsayalım:
Kotlin
data class User(val firstName: String, val lastName: String)
Java
public class User { public final String firstName; public final String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } }
Bu tür nesnede hiç değişmeyen veriler vardır. Uygulamalarda Bu veriler bir kez okunur ve daha sonra hiç değişmez. Ayrıca bir dizi resmi kullanabilirsiniz. belirli kurallara uyan bir nesne (örneğin, aşağıdaki örnekte gösterildiği gibi Java programlama dili:
Kotlin
// Not applicable in Kotlin. data class User(val firstName: String, val lastName: String)
Java
public class User { private final String firstName; private final String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return this.firstName; } public String getLastName() { return this.lastName; } }
Veri bağlama açısından bu iki sınıf eşdeğerdir. İlgili içeriği oluşturmak için kullanılan
@{user.firstName}
ifadesi şunun için kullanıldı:
android:text
özelliği önceki sınıftaki firstName
alanına ve
getFirstName()
yöntemini çağırın. Aynı zamanda
firstName()
(bu yöntem mevcutsa).
Verileri bağlama
Her düzen dosyası için bir bağlama sınıfı oluşturulur. Varsayılan olarak
sınıfı, Pascal büyük/küçük harf düzenine dönüştürülen düzen dosyasının adına dayanır.
Binding son eki. Örneğin, önceki düzen dosya adı
activity_main.xml
için geçerlidir. Yani, ilgili oluşturulan bağlama sınıfı
ActivityMainBinding
.
Bu sınıf, düzen özelliklerindeki tüm bağlamaları içerir. Örneğin,
user
değişkeni, düzenin görünümlerine çalışır ve değerlerin nasıl atanacağını bilir
seçin. Bağlamaları şişirirken oluşturmanızı öneririz
aşağıdaki örnekte gösterildiği gibi:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: ActivityMainBinding = DataBindingUtil.setContentView( this, R.layout.activity_main) binding.user = User("Test", "User") }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user = new User("Test", "User"); binding.setUser(user); }
Uygulama, çalışma zamanında kullanıcı arayüzünde Test kullanıcısını gösterir. Alternatif olarak
görünümü kullanmak için
LayoutInflater
,
şu örneği inceleyin:
Kotlin
val binding: ActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater())
Java
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
Bir
Fragment
ListView
veya
RecyclerView
adaptörü kullanmayı tercih ederseniz
inflate()
yöntemlerinin veya
DataBindingUtil
sınıfında
aşağıdaki kod örneğinde gösterilmiştir:
Kotlin
val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false) // or val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)
Java
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); // or ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
İfade dili
Ortak özellikler
İfade dili, yönetilen kodda bulunan ifadelere çok benzer. Siz ifade dilinde aşağıdaki operatörleri ve anahtar kelimeleri kullanabilir:
- Matematiksel:
+ - / * %
- Dize birleştirme:
+
- Mantıksal:
&& ||
- İkili:
& | ^
- Birli:
+ - ! ~
- Üst karakter:
>> >>> <<
- Karşılaştırma:
== > < >= <=
(<
,<
olarak kod dışına alınmalıdır) instanceof
- Gruplandırma:
()
- Karakter, Dize, sayısal,
null
gibi değişmez değerler - Yayınla
- Yöntem çağrıları
- Alan erişimi
- Dizi erişimi:
[]
- Üçlü operatör:
?:
Aşağıda bazı örnekler verilmiştir:
android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age > 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'
Eksik işlemler
Aşağıdaki işlemler, kullanabileceğiniz ifade söz diziminde eksik yönetilen kodda:
this
super
new
- Açık genel çağrı
Boş birleştirme operatörü
Boş birleştirme operatörü (??
), null
değilse sol işleneni seçer
veya ilk değer null
ise sağ taraf:
android:text="@{user.displayName ?? user.lastName}"
Bu, işlevsel olarak aşağıdakine eşdeğerdir:
android:text="@{user.displayName != null ? user.displayName : user.lastName}"
Mülk referansları
Bir ifade, aşağıdaki biçimi kullanarak sınıftaki bir özelliğe başvuruda bulunabilir:
Bu, alanlar, alıcılar ve
ObservableField
nesneler:
android:text="@{user.lastName}"
Boş işaretçi istisnalarından kaçınma
Oluşturulan veri bağlama kodu, null
değerlerini otomatik olarak kontrol eder ve
boş işaretçi istisnaları. Örneğin, @{user.name}
ifadesinde,
user
null, user.name
için varsayılan null
değeri atanmış. Şu durumda:
referans user.age
ise yaş int
türündeyse veri bağlama
varsayılan değere (0
) sahip.
Referansları göster
Bir ifade, aşağıdakini kullanarak düzendeki diğer görünümlere kimliğe göre başvuruda bulunabilir söz dizimi:
android:text="@{exampleText.text}"
Aşağıdaki örnekte, TextView
görünümü bir EditText
görünümüne referans verir:
aynı düzeni sağlar:
<EditText
android:id="@+id/example_text"
android:layout_height="wrap_content"
android:layout_width="match_parent"/>
<TextView
android:id="@+id/example_output"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{exampleText.text}"/>
Koleksiyonlar
Diziler, listeler, seyrek listeler ve
eşlemelerini sağlamalısınız.[]
<data>
<import type="android.util.SparseArray"/>
<import type="java.util.Map"/>
<import type="java.util.List"/>
<variable name="list" type="List<String>"/>
<variable name="sparse" type="SparseArray<String>"/>
<variable name="map" type="Map<String, String>"/>
<variable name="index" type="int"/>
<variable name="key" type="String"/>
</data>
...
android:text="@{list[index]}"
...
android:text="@{sparse[index]}"
...
android:text="@{map[key]}"
Ayrıca, object.key
gösterimini kullanarak haritadaki bir değere referansta bulunabilirsiniz. Örneğin,
örnek, önceki örnekte @{map[key]}
öğesini
@{map.key}
.
Dize değişmez değerleri
Özellik değerini başına tek tırnak işareti koyabilirsiniz. Bu özellik, aşağıdaki örnekte gösterildiği gibi, ifadede çift tırnak işareti:
android:text='@{map["firstName"]}'
Özellik değerinin başında ve sonunda çift tırnak işareti de kullanabilirsiniz. Bu sırada
dize değişmez değerleri, gösterildiği gibi `
vurgu işaretleriyle çevrelenmelidir
buradan inceleyebilirsiniz:
android:text="@{map[`firstName`]}"
Kaynaklar
Bir ifade, aşağıdaki söz dizimiyle uygulama kaynaklarına başvurabilir:
android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"
Parametreler sağlayarak biçim dizelerini ve çoğulları değerlendirebilirsiniz:
android:text="@{@string/nameFormat(firstName, lastName)}"
android:text="@{@plurals/banana(bananaCount)}"
Mülk referanslarını iletebilir ve mülk referanslarını referansları kaynak parametreleri olarak ekleyin:
android:text="@{@string/example_resource(user.lastName, exampleText.text)}"
Bir çoğul birden fazla parametre aldığında tüm parametreleri iletin:
Have an orange
Have %d oranges
android:text="@{@plurals/orange(orangeCount, orangeCount)}"
Bazı kaynaklar, aşağıda gösterildiği gibi açık tür değerlendirmesi gerektirir tablo:
Tür | Normal referans | İfade referansı |
---|---|---|
String[] |
@array |
@stringArray |
int[] |
@array |
@intArray |
TypedArray |
@array |
@typedArray |
Animator |
@animator |
@animator |
StateListAnimator |
@animator |
@stateListAnimator |
color int |
@color |
@color |
ColorStateList |
@color |
@colorStateList |
Olay işleme
Veri bağlama,
görüntüleme sayısını artırır (örneğin,
onClick()
yöntemidir. Etkinlik özelliği adları, işleyici yönteminin adına göre belirlenir.
birkaç istisna vardır. Örneğin,
View.OnClickListener
yöntemi olarak onClick()
kullanılır. Bu nedenle bu etkinliğin özelliği android:onClick
.
Tıklama etkinliği için
özelliğinde android:onClick
farklı bir özelliği kullanın. URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için
aşağıdaki özellikleri kullanın:
Sınıf | Dinleyici belirleyici | Özellik |
---|---|---|
SearchView |
setOnSearchClickListener(View.OnClickListener) |
android:onSearchClick |
ZoomControls |
setOnZoomInClickListener(View.OnClickListener) |
android:onZoomIn |
ZoomControls |
setOnZoomOutClickListener(View.OnClickListener) |
android:onZoomOut |
Bu iki mekanizmayı kullanabilirsiniz. Bu mekanizmalar, Analytics 360'taki bir etkinliği işlemek için:
- Yöntem referansları: İfadelerinizde şunları yapabilirsiniz:
ve dinleyici yönteminin imzasına
uygun referans yöntemlere başvurmalıdır. Zaman
bir ifade bir yöntem referansına dönüşür, veri bağlama ise yöntemi sarmalar
referans ve sahip nesnesini belirler ve bu işleyiciyi
hedef görünümü. İfade
null
olarak değerlendirilirse veri bağlama işleyici oluşturabilir ve bunun yerine birnull
işleyicisi ayarlayabilirsiniz. - Dinleyici bağlamaları: Bunlar, anında yanıt veren lambda ifadeleridir etkinlik gerçekleştiğinde değerlendirilir. Veri bağlama her zaman işleyiciyi seçin. Etkinlik gönderildiğinde işleyici, lambda ifadesini değerlendirir.
Yöntem referansları
Aşağıdaki yönteme benzer şekilde etkinlikleri doğrudan işleyici yöntemlerine bağlayabilirsiniz:
ata
android:onClick
itibarıyla bir
yöntemini kullanabilirsiniz. Bir avantaja kıyasla
View
onClick
özelliği,
ifadesi, derleme sırasında işlenir. Yöntem mevcut değilse veya
imza yanlışsa derleme zamanı hatası alırsınız.
Yöntem referansları ve işleyici bağlamaları arasındaki en önemli fark gerçek dinleyici uygulaması, tetiklendiği anlamına gelir. Söz konusu etkinlik gerçekleştiğinde ifadeyi değerlendirmeyi işleyici bağlamalarını kullanın.
Bir etkinliği işleyicisine atamak için değeri çağrılacak yöntem adıdır. Örneğin, düzen veri nesnesi:
Kotlin
class MyHandlers { fun onClickFriend(view: View) { ... } }
Java
public class MyHandlers { public void onClickFriend(View view) { ... } }
Bağlama ifadesi,
onClickFriend()
yöntemini kullanın:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="handlers" type="com.example.MyHandlers"/>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"
android:onClick="@{handlers::onClickFriend}"/>
</LinearLayout>
</layout>
İşleyici bağlamaları
İşleyici bağlamaları, bir etkinlik gerçekleştiğinde çalışan bağlayıcı ifadelerdir. Onlar yöntem referanslarına benzer ancak rastgele veri bağlama çalıştırmanıza olanak tanırlar ifade eder. Bu özellik Gradle için Android Gradle Eklentisi ile kullanılabilir 2.0 veya daha yeni bir sürüme sahip olduğunuzdan emin olun.
Yöntem referanslarında, yöntemin parametreleri
yardımcı olur. İşleyici bağlamalarında yalnızca döndürülen değeriniz
void
beklemiyorsa işleyicinin beklenen dönüş değeri. Örneğin,
örneği, onSaveClick()
olan aşağıdaki sunucu sınıfını ele alalım
yöntem:
Kotlin
class Presenter { fun onSaveClick(task: Task){} }
Java
public class Presenter { public void onSaveClick(Task task){} }
Tıklama etkinliğini onSaveClick()
yöntemine aşağıdaki şekilde bağlayabilirsiniz:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="task" type="com.android.example.Task" />
<variable name="presenter" type="com.android.example.Presenter" />
</data>
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content"
android:onClick="@{() -> presenter.onSaveClick(task)}" />
</LinearLayout>
</layout>
Bir ifadede geri çağırma kullanıldığında, veri bağlaması otomatik olarak ve etkinlik için kaydeder. Görüntü veri bağlama, verilen ifadeyi değerlendirir. Normal bağlamada olduğu gibi ifadeleri için aşağıdaki işlemler sırasında veri bağlamanın boş ve iş parçacığı güvenliğini alırsınız: nasıl değerlendirildiğini açıklayacağız.
Yukarıdaki örnekte, onClick(View)
parametresine iletilen view
parametresi
tanımlanmamıştır. İşleyici bağlamaları, işleyici parametreleri için iki seçenek sunar:
yöntemin tüm parametrelerini yok sayabilir veya hepsini adlandırabilirsiniz. Dilerseniz
bunları ifadenizde kullanabilirsiniz. Örneğin,
önceki ifadeyi aşağıdaki gibi yazabilir:
android:onClick="@{(view) -> presenter.onSaveClick(task)}"
İfadede parametreyi kullanmak istiyorsanız bunu aşağıdaki şekilde yapabilirsiniz:
Kotlin
class Presenter { fun onSaveClick(view: View, task: Task){} }
Java
public class Presenter { public void onSaveClick(View view, Task task){} }
android:onClick="@{(theView) -> presenter.onSaveClick(theView, task)}"
Bir lambda ifadesini birden fazla parametreyle kullanabilirsiniz:
Kotlin
class Presenter { fun onCompletedChanged(task: Task, completed: Boolean){} }
Java
public class Presenter { public void onCompletedChanged(Task task, boolean completed){} }
<CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content"
android:onCheckedChanged="@{(cb, isChecked) -> presenter.completeChanged(task, isChecked)}" />
Dinlediğiniz etkinlik, türü void
olmayan bir değer döndürürse
ifadelerinin de aynı türde değeri döndürmesi gerekir. Örneğin,
dokunmayı dinleyin ve bekleme (uzun tıklama) etkinliği olduğunda, ifadeniz bir
boole'ye dokunun.
Kotlin
class Presenter { fun onLongClick(view: View, task: Task): Boolean { } }
Java
public class Presenter { public boolean onLongClick(View view, Task task) { } }
android:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"
İfade, null
nesne nedeniyle değerlendirilemezse veri bağlama döndürülür
bu tür için varsayılan değer (örneğin, referans türleri için null
, referans türleri için 0
)
int
veya boolean
boyunca false
.
Bir yüklem içeren bir ifade kullanmanız gerekirse (örneğin,
üçlü — void
öğesini simge olarak kullanabilirsiniz:
android:onClick="@{(v) -> v.isVisible() ? doSomething() : void}"
Karmaşık dinleyicilerden kaçının
İşleyici ifadeleri güçlüdür ve kodunuzun daha kolay okunmasını sağlayabilir. Öte yandan, karmaşık ifadeler içeren işleyiciler düzenlerinizi zorlaştırır. kolay bir yoludur. İfadelerinizi, mevcut verileri iletmek kadar basit tutun geri çağırma yönteminizden aktarın. Herhangi bir iş mantığını geri çağırma yöntemini kullanabilirsiniz.
İçe aktarma işlemleri, değişkenler ve içerir
Veri Bağlama Kitaplığı; içe aktarma işlemleri, değişkenler ve içerir. İçe aktarma işlemleri, düzen dosyalarınızdaki sınıflara kolayca başvuru yapmanızı sağlar. Değişkenler, bağlama ifadelerinde kullanılabilecek bir özelliği tanımlamanıza olanak tanır. İçerikler, karmaşık düzenleri uygulamanızda tekrar kullanmanızı sağlar.
İçe aktarmalar
İçe aktarma işlemleri, yönetilen kodda olduğu gibi, düzen dosyanızdaki sınıflara başvuruda bulunmanıza olanak tanır.
data
öğesinin içinde sıfır veya daha fazla import
öğesi kullanabilirsiniz. İlgili içeriği oluşturmak için kullanılan
aşağıdaki kod örneği, View
sınıfını düzen dosyasına aktarır:
<data>
<import type="android.view.View"/>
</data>
View
sınıfını içe aktardığınızda, bu sınıfa bağlama ifadelerinizden başvuruda bulunabilirsiniz.
Aşağıdaki örnekte,
VISIBLE
ve
View
sınıfının GONE
sabitleri:
<TextView
android:text="@{user.lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>
Takma adları yazın
Sınıf adı çakışmaları olduğunda sınıflardan birini
takma ad'dır. Aşağıdaki örnekte, View
sınıfının adı
Vista
grubuna com.example.real.estate
paketi:
<import type="android.view.View"/>
<import type="com.example.real.estate.View"
alias="Vista"/>
Daha sonra com.example.real.estate.View
ve View
referansları için Vista
kullanabilirsiniz
öğesine de başvurmalıdır.android.view.View
Diğer sınıfları içe aktar
İçe aktarılan türleri, değişkenlerde ve ifadelerde tür referansı olarak kullanabilirsiniz. İlgili içeriği oluşturmak için kullanılan
aşağıdaki örnekte değişken türü olarak kullanılan User
ve List
gösterilmektedir:
<data>
<import type="com.example.User"/>
<import type="java.util.List"/>
<variable name="user" type="User"/>
<variable name="userList" type="List<User>"/>
</data>
Bir ifadenin bir kısmını yayınlamak için içe aktarılan türleri kullanabilirsiniz. Aşağıdakiler
örnek, connection
özelliğini bir User
türüne dönüştürür:
<TextView
android:text="@{((User)(user.connection)).lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
İçe aktarılan türleri,
ifade eder. Aşağıdaki kod, MyStringUtils
sınıfını ve referansları içe aktarır
capitalize
yöntemi:
<data>
<import type="com.example.MyStringUtils"/>
<variable name="user" type="com.example.User"/>
</data>
…
<TextView
android:text="@{MyStringUtils.capitalize(user.lastName)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
java.lang.*
, yönetilen kodda olduğu gibi otomatik olarak içe aktarılır.
Değişkenler
data
öğesinin içinde birden fazla variable
öğesi kullanabilirsiniz. Her biri
variable
öğesi, kullanılacak düzende ayarlanabilecek bir özelliği açıklar
bağlama ifadelerine yer vermelisiniz. Aşağıdaki örnekte,
user
, image
ve note
değişkenleri:
<data>
<import type="android.graphics.drawable.Drawable"/>
<variable name="user" type="com.example.User"/>
<variable name="image" type="Drawable"/>
<variable name="note" type="String"/>
</data>
Değişken türleri, derleme sırasında incelenir. Bu nedenle, bir değişken
Observable
veya bir
gözlemlenebilir koleksiyon,
yansıtılması gerekir. Değişken bir temel sınıf veya arayüzse
Observable
arayüzünü uygulamayayan değişkenler kullanılmaz
gözlemlendi.
Çeşitli yapılandırmalar için farklı düzen dosyaları (örneğin, yatay veya dikey) değişkenler birleştirilir. Kodlarda, Bu düzen dosyaları arasında çelişen değişken tanımları var.
Oluşturulan bağlama sınıfında, açıklanan
değişkenlerine karşılık gelir. Değişkenler, belirleyiciye kadar varsayılan yönetilen kod değerlerini alır
çağrılır—referans türleri için null
, referans türleri için 0
, int
için false
boolean
vb.
Bağlama ifadelerinde kullanılmak üzere context
adlı özel bir değişken oluşturulur
gerekir. context
için değer:
Kök görünümünün Context
nesnesinden
getContext()
yöntemini kullanarak giriş yapabilirsiniz. İlgili içeriği oluşturmak için kullanılan
context
değişkeni,
dokunun.
İçerir
Değişkenleri, kapsayıcı düzeninden dahil edilen bir düzenin bağlamasına aktarabilirsiniz
düzeni değiştirebilirsiniz. İlgili içeriği oluşturmak için kullanılan
aşağıdaki örnekte name.xml
veuser
contact.xml
düzen dosyaları:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/name"
bind:user="@{user}"/>
<include layout="@layout/contact"
bind:user="@{user}"/>
</LinearLayout>
</layout>
Veri bağlama, birleştirme öğesinin doğrudan alt öğesi olarak eklemeyi desteklemez. Örneğin, aşağıdaki düzen desteklenmez:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable name="user" type="com.example.User"/>
</data>
<merge><!-- Doesn't work -->
<include layout="@layout/name"
bind:user="@{user}"/>
<include layout="@layout/contact"
bind:user="@{user}"/>
</merge>
</layout>
Ek kaynaklar
Veri bağlama hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.