(对不起,如果我的问题标题不是很好,我想不出一个更好的。随时提出更好的选择。)绑定到任意深度的属性
我想在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