(내 질문 제목이 좋지 않으면 죄송합니다. 더 나은 옵션을 제안 할 수는 없습니다.)규칙에 따라 객체의 임의로 딥 속성에 바인딩
저는 오브젝트를 그리드에 바인딩 할 수 있지만 오브젝트의 프리젠 테이션을 어느 정도 사용자 정의 할 수있는 방식으로 재사용 가능한 "특성 격자"를 각도로 작성하려고합니다.
이
처럼 지시어 템플릿 모습입니다합니다 (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()
기능 그쪽 :
다음은 사용 예입니다 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;
};
나는 그런 "속성 데이터"기능을 통해가는 단지 객체의 속성에 직접 바인딩 아니에요 이유는 나뿐만 아니라, 속성의 순서를 제어 할 필요가있다
심지어는 사용자에게 표시할지 여부와 프레젠테이션을 위해 어떤 종류의 속성 (텍스트, 전자 메일, 번호, 날짜 등)인지에 따라 다릅니다.
먼저 getSitePropertyData()
함수에서 나머지 숫자 인 value
에서 알 수 있듯이이 함수에서 직접 값을 제공하려고 시도했지만 객체에 바인딩되지 않으므로 개체 또는 양식이 변경됩니다 속성 표가 앞뒤로 동기화되지 않았습니다. 다음으로는 key
아이디어를 사용하고 있습니다. 바로 이것을 수행 할 수 있습니다 : propertyObject[prop.key]
- 직접 속성에 적합하지만 볼 수있는 것처럼 속성의 속성이기 때문에 "Company"필드를 주석 처리해야했습니다. , propertyObject["a.b"]
이 작동하지 않습니다.
나는 여기서 무엇을해야할지 고민 중입니다. 바인딩이 필요합니다. 바인딩에 임의로 깊은 속성을 사용할 수 있어야합니다. 나는 이런 종류의 것이 이론적으로 가능하다는 것을 안다; 예를 들어 UI Grid에서 완료 한 것을 보았습니다. 그러나 그러한 프로젝트에는 너무 많은 코드가있어서 내가 어떻게 작업하는지 찾는 데 많은 시간을 할애 할 것입니다.
내가 가까워지고 있습니까, 아니면이 모든 일이 잘못 될까요?
나는 당신의 대답 미스를 생각한다 내 질문에서 두 가지 가장 중요한 점. 첫째, "나는"속성 데이터 "기능을 통해 가고 개체의 속성에 직접 바인딩하는 것이 아니라 속성의 순서를 제어해야한다는 이유가 있습니다." for 루프를 사용하면 이러한 제어가 허용되지 않습니다. 둘째, "이 함수에서 직접 값을 제공하려고 시도했지만 개체에 바인딩되지 않으므로 개체 또는 양식에서 변경 내용이 앞뒤로 동기화되지 않았습니다." 솔루션에서이 양방향 바인딩을 요구하지 않습니다. – Alex