元素繫結(element binding)允許我們將元素繫結到模型資料中的特定物件,這將建立繫結上下文(binding context)並允許控制元件及其所有子項中的相對繫結
。 這在 master-detail 場景中特別有用。
假設我們有以下 JSON 資料:
{
"company" : {
"name" : "Acme Inc."
"street": "23 Franklin St."
"city" : "Claremont”
"state" : "New Hampshire”
"zip” : "03301"
"revenue": "1833990"
}
}
element binding 的語法:
<mvc:View
controllerName="sap.ui.sample.App"
xmlns="sap.m"
xmlns:mvc="sap.ui.core.mvc">
<Input id="companyInput"
binding="{/company}"
value="{name}"
tooltip="The name of the company is '{name}'"/>
</mvc:View>
其中這段程式碼實際上定義了繫結上下文:
binding="{/company}"
這樣 value 屬性可以直接繫結到 json 模型 company 中的相對路徑欄位比如 name 上去。
如果不採用 element binding,我們需要使用絕對路徑作為繫結路徑,即使用符號 / 開頭的絕對路徑語法:
<mvc:View
controllerName="sap.ui.sample.App"
xmlns="sap.m"
xmlns:mvc="sap.ui.core.mvc">
<Input id="companyInput"
value="{/company/name}"
tooltip="The name of the company is '{/company/name}'}"/>
</mvc:View>
JavaScript 程式碼實現 element binding:
var oInput = this.byId("companyInput")
oInput.bindElement("/company");
oInput.bindProperty("value", "name");
element binding 的應用場合
當一個 UI 介面的不同欄位,其資料來源從邏輯意義上說來自同一資料模型的同一層級時,element binding 特別有用:
<mvc:View
controllerName="sap.ui.sample.App"
xmlns="sap.m"
xmlns:mvc="sap.ui.core.mvc">
<l:VerticalLayout id="vLayout"
binding="{/company}"
width="100%">
<Text text="{name}" />
<Text text="{city}" />
<Text text="{county}" />
</l:VerticalLayout>
</mvc:View>
如何建立一個新的 binding context
看個例子,我們有如下的 json 檔案:
{
companies : [
{
name : "Acme Inc.",
city: "Belmont",
state: "NH",
county: "Belknap",
revenue : 123214125.34
},{
name : "Beam Hdg.",
city: "Hancock",
state: "NH",
county: "Belknap"
revenue : 3235235235.23
},{
name : "Carot Ltd.",
city: "Cheshire",
state: "NH",
county: "Sullivan",
revenue : "Not Disclosed"
}]
}
有這樣一個 input field:
<mvc:View
controllerName="sap.ui.sample.App"
xmlns="sap.m"
xmlns:mvc="sap.ui.core.mvc">
<Input id="companyInput"
value="{name}"/>
</mvc:View>
如何設定繫結上下文:
var oInput = this.byId("companyInput");
oInput.bindElement("/companies/0");
XML 檢視已將輸入值繫結到模型中的 name 屬性。 由於未設定模型中此屬性的路徑,因此無法 resolve. 要解析繫結,您可以使用 bindElement 方法從指定的相對路徑建立一個新的上下文。
若要刪除當前繫結上下文,請在輸入控制元件上呼叫 unbindElement 方法。 透過這樣做,所有繫結現在再次相對於父上下文解析。
您還可以將 bindElement 方法與聚合繫結結合使用。 讓我們考慮 JSON 資料的以下擴充套件:
{
regions: [
{
name: "Americas",
companies : [
{
name : "Acme Inc.",
zip : "03301",
city: "Belmont",
county: "Belknap",
state: "NH",
revenue : 123214125.34,
publ: true
},
{
name : "Beam Hdg.",
zip : "03451",
city: "Hancock",
county: "Sullivan",
state: "NH",
revenue : 3235235235.23,
publ: true
},
{
name : "Carot Ltd.",
zip : "03251",
city: "Cheshire",
county: "Sullivan",
state: "NH",
revenue : "Not Disclosed",
publ: false
}]
},{
name: "DACH",
companies : [
{
name : "Taubtrueb",
zip : "89234",
city: "Ginst",
county: "Musenhain",
state: "NRW",
revenue : 2525,
publ: true
},
{
name : "Krawehl",
zip : "45362",
city: "Schlonz",
county: "Humpf",
state: "BW",
revenue : 2342525,
publ: true
}]
}
]
}
如上 json 檔案所示,regions 裡包含了一個 companies 列表。
<mvc:View
controllerName="sap.ui.sample.App"
xmlns="sap.m"
xmlns:mvc="sap.ui.core.mvc">
<List id=”companyList” items="{companies}">
<items>
<StandardListItem
title="{name}"
description="{city}"
/>
</items>
</List>
</mvc:View>
下面這行語句無法直接被解析,因為這是一個相對路徑。
items="{companies}"
我們需要在控制器裡使用 element binding:
var oList = this.byId("companyList");
oList.bindElement("/regions/0");
這樣,regions 陣列裡第一個元素,America,包含的所有 companies 就能夠正確顯示了。