(Tôi xin lỗi nếu tiêu đề câu hỏi của tôi không tốt lắm, tôi không thể nghĩ ra một câu hỏi hay hơn. Vui lòng đề xuất các tùy chọn tốt hơn.)Ràng buộc các thuộc tính sâu tùy ý trên một đối tượng dựa trên các quy tắc
Tôi đang cố gắng tạo ra một "lưới điện bất động sản" có thể tái sử dụng trong Angular, nơi mà người ta có thể ràng buộc một đối tượng vào lưới điện, nhưng theo cách mà trình bày của đối tượng có thể được tùy chỉnh một chút.
Đây là những gì các mẫu chỉ trông giống như (những form-element
là không quan trọng đối với câu hỏi của tôi, vì vậy tôi sẽ để nó ra):
<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>
và mã chỉ thị:
angular.module("app.shared").directive('propertyGrid', ['$log', function($log) {
return {
restrict: 'E',
scope: {
propertyObject: '=',
propertyData: '&'
}
templateUrl: 'views/propertyGrid.html'
};
}]);
Dưới đây là một cách sử dụng ví dụ:
<property-grid edit-mode="true"
property-object="selectedSite"
property-data="getSitePropertyData(object)">
</property-grid>
Và getSitePropertyData()
chức năng tha t đi với nó:
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;
};
Lý do tôi đang trải qua một chức năng "dữ liệu bất động sản" như vậy và không chỉ ràng buộc trực tiếp đến tài sản trên đối tượng là tôi cần phải kiểm soát thứ tự của các thuộc tính, cũng cho dù họ có được hiển thị cho người dùng chút nào hay không và cũng là loại tài sản gì (văn bản, email, số, ngày, v.v.) vì mục đích trình bày.
Lúc đầu, khi bạn có thể biết số dư tài sản value
trong hàm getSitePropertyData()
, trước tiên tôi đã thử cung cấp các giá trị trực tiếp từ hàm này, nhưng điều đó sẽ không ràng buộc với đối tượng, do đó thay đổi trong đối tượng hoặc biểu mẫu lưới thuộc tính không đồng bộ qua lại. Tiếp theo, sau đó, đã sử dụng ý tưởng key
, cho phép tôi thực hiện điều này: propertyObject[prop.key]
—các tác phẩm tuyệt vời cho thuộc tính trực tiếp, nhưng như bạn thấy, tôi phải nhận xét trường "Công ty" vì đó là thuộc tính của một thuộc tính và propertyObject["a.b"]
không hoạt động.
Tôi đang cố gắng tìm ra những việc cần làm ở đây. Tôi cần các ràng buộc để làm việc, và tôi cần để có thể sử dụng các thuộc tính sâu tùy ý trong các ràng buộc của tôi. Tôi biết loại điều này về mặt lý thuyết là có thể; Tôi đã nhìn thấy nó được thực hiện ví dụ trong UI Grid, nhưng các dự án như vậy có rất nhiều mã mà tôi có lẽ sẽ dành nhiều ngày tìm hiểu cách họ làm điều đó.
Tôi có gần gũi không, hoặc tôi đang đi về điều này tất cả sai?
Tôi nghĩ rằng bỏ lỡ câu trả lời của bạn hai điểm quan trọng nhất trong câu hỏi của tôi. Đầu tiên, tôi nói "Lý do tôi đi qua một hàm" dữ liệu thuộc tính "và không chỉ ràng buộc trực tiếp đến các thuộc tính trên đối tượng là tôi cần kiểm soát thứ tự của các thuộc tính." Sử dụng vòng lặp for sẽ không cho phép điều khiển như vậy. Thứ hai, tôi nói "Lần đầu tiên tôi thử cung cấp các giá trị trực tiếp từ hàm này, nhưng điều đó sẽ không liên kết với đối tượng, do đó thay đổi trong đối tượng hoặc biểu mẫu lưới thuộc tính không đồng bộ qua lại". Giải pháp của bạn sẽ không cho phép ràng buộc hai chiều bắt buộc này. – Alex