(對不起,如果我的問題標題不是很好,我想不出一個更好的。隨時提出更好的選擇。)綁定到任意深度的屬性
我想在Angular中創建一個可重複使用的「屬性網格」,其中可以將對象綁定到網格,但以這種方式可以對對象的表示進行一些定製。
這是指令模板是什麼樣子(該form-element
是不是我的問題很重要,所以我會離開它):
<div ng-repeat="prop in propertyData({object: propertyObject})">
<div ng-switch on="prop.type">
<div ng-switch-when="text">
<form-element type="text"
label-translation-key="{{prop.key}}"
label="{{prop.key}}"
name="{{prop.key}}"
model="propertyObject[prop.key]"
focus-events-enabled="false">
</form-element>
</div>
</div>
</div>
,並指令代碼:
angular.module("app.shared").directive('propertyGrid', ['$log', function($log) {
return {
restrict: 'E',
scope: {
propertyObject: '=',
propertyData: '&'
}
templateUrl: 'views/propertyGrid.html'
};
}]);
下面是一個例子用法:
<property-grid edit-mode="true"
property-object="selectedSite"
property-data="getSitePropertyData(object)">
</property-grid>
而且getSitePropertyData()
功能THA t趨於吧:
var lastSite;
var lastSitePropertyData;
$scope.getSitePropertyData = function (site) {
if (site == undefined) return null;
if (site == lastSite)
return lastSitePropertyData;
lastSite = site;
lastSitePropertyData = [
{key:"SiteName", value:site.SiteName, editable: true, type:"text"},
//{key:"Company.CompanyName", value:site.Company.CompanyName, editable: false, type:"text"},
{key:"Address1", value:site.Address1, editable: true, type:"text"},
{key:"Address2", value:site.Address2, editable: true, type:"text"},
{key:"PostalCode", value:site.PostalCode, editable: true, type:"text"},
{key:"City", value:site.City, editable: true, type:"text"},
{key:"Country", value:site.Country, editable: true, type:"text"},
{key:"ContactName", value:site.ContactName, editable: true, type:"text"},
{key: "ContactEmail", value: site.ContactEmail, editable: true, type:"email"},
{key: "ContactPhone", value: site.ContactPhone, editable: true, type:"text"},
{key: "Info", value: site.Info, editable: true, type:"text"}
];
return lastSitePropertyData;
};
我要通過這樣的「屬性數據」功能,而不僅僅是直接綁定到屬性的對象上的原因是,我需要控制屬性的順序,以及因爲它們是否應該甚至向用戶展示,以及爲了演示的目的它是什麼樣的屬性(文本,電子郵件,數字,日期等)。
起初,您可以從函數中的value
屬性殘餘中知道,我首先嚐試直接從該函數提供值,但不會綁定到該對象,因此可以更改對象或窗體物業網格不會來回同步。接下來是使用key
的想法,它可以讓我這樣做:propertyObject[prop.key]
-這對於直接屬性很好,但正如你所看到的,我必須註釋掉「公司」字段,因爲它是屬性的屬性,並且propertyObject["a.b"]
不起作用。
我在努力弄清楚在這裏要做什麼。我需要綁定才能工作,並且我需要能夠在綁定中使用任意深度的屬性。我知道這種事情在理論上是可能的,例如我在UI Grid中看到過,但這樣的項目有很多代碼,我可能會花幾天的時間查找它們是如何實現的。
我靠近了嗎?還是我在談論這一切都是錯誤的?
我認爲你的回答失誤在我的問題中最重要的兩點。首先,我說「我之所以要通過這樣的」屬性數據「函數,而不是直接綁定到對象的屬性上,是因爲我需要控制屬性的順序。」使用for循環將不允許這種控制。其次,我說:「我首先嚐試直接從這個函數提供值,但不會綁定到對象,所以更改對象或形成屬性網格不會來回同步。」您的解決方案不會允許這種所需的雙向綁定。 – Alex