希望有人能更好地了解Breeze的扩展实体,因为我很难过!因此,我在服务器端创建了一个部分类(WO_Rout)(使用Breeze API的Web API)并创建了一个名为“AssetJobEqNo”的属性。
我已阅读并遵循Breeze的文档here但无济于事。在指南之后,我为这个特定实体创建了一个构造函数“WO_Rout”,如下所示:
var assets = function () {
this.AssetJobEqNo = '';
};
var serviceName = 'cms8/workorders';
var manager = new breeze.EntityManager({
serviceName: serviceName
});
var store = manager.metadataStore;
store.registerEntityTypeCtor('WO_Rout', assets);
当我查询我的控制器时,会发送此特定属性“AssetJobEqNo”并在客户端的JSON原始结果中看到。
所以....这是我无法弄清楚的奇怪部分。如果我运行一个查询绑定到我的UI上的按钮属性IS加载和我分配给它的对象,但它仍然是一个空字符串的默认值,它永远不会加载。然后我再次运行EXACT相同的查询抓取相同的实体,这次值为IS。
总之,我很困惑为什么这个扩展实体的属性没有填充第一个查询,但如果我运行完全相同的查询,它会第二次加载?
希望这一切都有意义。
dataService功能:
function getWorkOrder(reqNo) {
if (reqNo > 0) {
var query = breeze.EntityQuery.from("GetWorkOrders");
query = query.where("req_no", "==", reqNo)
.expand(["WO_RtHelp.WO_Rout", "WO_RtHelp.WO_Rout.eqptmast", "WO_RtHelp.WO_Act.WO_Resources.persmast", "WO_RtHelp.WO_Act.WO_Resources.Kits", "WO_RtHelp.WO_Act.Activity", "WO_RtHelp.WO_Act.WO_Resources.customer", "WO_RtHelp.WO_Act.WO_Resources.eqptmast", "WO_RtHelp.WO_Act.WO_Resources.invsite.invmast", "WO_RtHelp.WO_Act.WO_Resources.crew"])
return manager.executeQuery(query);
} else {
return throwNotification('Please enter a Work Order number.');
}
}
成功查询的控制器功能
function querySucceeded(data) {
$scope.WorkOrder = {};
if (data.results.length === 0) {
sysErrorNotification('No Work Order with System #' + $scope.workOrderSearchNumber);
}
else {
$scope.WorkOrder = data.results[0];
$scope.myData = $scope.WorkOrder.WO_RtHelp;
$('#bottomNav a[href="/WorkOrders/#woMain"]').tab('show');
resetDataSources();
$scope.$apply();
}
}
我正在使用Breeze,Angular,Q和jQuery
答案 0 :(得分:1)
因此,经过几天的锤击,我相信我已经解决了这个问题。在跟踪实体的创建和合并过程之后,当从查询中实现时,我发现我的财产被" rawEntity"它具有""。
的扩展实体属性的默认值我使用Breeze 1.4.2并使用breeze.debug.js进行调试,并在第14854行找到函数proto.initializeFrom导致此问题。
以下是解决此问题的方法:
proto.initializeFrom = function (rawEntity) {
// HACK:
// copy unmapped properties from newly created client entity to the rawEntity.
// This is so that we don't lose them when we update from the rawEntity to the target.
// Something that will occur immediately after this method completes.
var that = this;
this.entityType.unmappedProperties.forEach(function(prop) {
var propName = prop.name;
that[propName] = rawEntity[propName]; // CassidyK
//rawEntity[propName] = that[propName]; // Breeze
});
if (!this._backingStore) {
this._backingStore = { };
}
};
如果我发现我在此处实施的修复程序有任何问题,我会及时更新。
答案 1 :(得分:0)
在下面的问题中查看Ward的答案 - 它应该为您提供未映射属性的指导。
UnMapped property on the Angular/Breeze SPA template
我不明白它是如何工作的,说实话,除非我遗漏了你已经宰了扩展的东西()
query = query.where("req_no", "==", reqNo)
.expand(["WO_RtHelp.WO_Rout", "WO_RtHelp.WO_Rout.eqptmast", "WO_RtHelp.WO_Act.WO_Resources.persmast", "WO_RtHelp.WO_Act.WO_Resources.Kits", "WO_RtHelp.WO_Act.Activity", "WO_RtHelp.WO_Act.WO_Resources.customer", "WO_RtHelp.WO_Act.WO_Resources.eqptmast", "WO_RtHelp.WO_Act.WO_Resources.invsite.invmast", "WO_RtHelp.WO_Act.WO_Resources.crew"])
应该是一个字符串,其中的值是分开的 -
query = query.where("req_no", "==", reqNo)
.expand("WO_RtHelp.WO_Rout", "WO_RtHelp.WO_Rout.eqptmast, WO_RtHelp.WO_Act.WO_Resources.persmast, WO_RtHelp.WO_Act.WO_Resources.Kits, WO_RtHelp.WO_Act.Activity, WO_RtHelp.WO_Act.WO_Resources.customer, WO_RtHelp.WO_Act.WO_Resources.eqptmast, WO_RtHelp.WO_Act.WO_Resources.invsite.invmast, WO_RtHelp.WO_Act.WO_Resources.crew")
请注意,我没有传递一个字符串数组,我传递了一个用逗号分隔值的字符串。