【问题标题】:Breeze Extended Entity Property Only Loads on Second QueryBreeze 扩展实体属性仅在第二个查询时加载
【发布时间】:2013-09-20 22:22:34
【问题描述】:

希望有人对 Breeze 的扩展实体有更好的了解,因为我很难过!因此,我在服务器端(使用 Breeze 的 API 的 Web API)创建了一个部分类 (WO_Rout),并创建了一个名为“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 上的按钮相关联的查询,则加载该属性并在我分配它的对象中,但它仍然是空字符串的默认值,它永远不会加载。然后我再次运行完全相同的查询,获取相同的实体,这次值就在那里。

总之,我很困惑为什么这个扩展实体的属性没有被第一次查询填充,但是如果我运行完全相同的查询,它会在第二次加载?

希望这一切都有意义。

数据服务功能:

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

【问题讨论】:

  • 我没有使用过微风,所以这可能是一个无知的问题,但是 querySucceeded 是如何被调用的呢?你有手表吗?您说您可以看到请求发生并且数据得到更新,但是是什么触发了角度来执行范围应用(或者您的函数具有应用到触发)?从控制台,这是否使它工作? angular.element($("[ng-app]")).scope().$apply();
  • 根据dataservice中的函数调用。在调用数据服务的函数中有一个 .then(querySucceeded) 和 .fail(queryFailed) 来路由查询结果。不,这并不能使它工作,因为我已经从角度范围内调用了 apply 方法。
  • 这里是查询被调用的地方: $scope.getAllWorkOrders = function () { workOrderDataservice.getWorkOrder($scope.workOrderSearchNumber) .then(querySucceeded) .fail(queryFailed); };

标签: entity-framework angularjs breeze


【解决方案1】:

所以经过几天的努力,我相信我已经解决了这个问题。在遵循实体的创建和合并过程之后,在从查询中具体化时,我发现我的属性被“rawEntity”覆盖,该“rawEntity”具有“”扩展实体属性的默认值。

我正在使用 Breeze 1.4.2 并使用微风.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 = { };
        }
    };

如果我发现我在此处实施的修复有任何问题,我会及时更新。

【讨论】:

    【解决方案2】:

    查看 Ward 在以下问题中的回答 - 它应该为您提供有关未映射属性的指导。

    UnMapped property on the Angular/Breeze SPA template

    老实说,我根本看不出它是如何工作的,除非我遗漏了一些你杀死了 expand() 的东西

    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")
    

    请注意,我没有传递字符串数组,而是传递了一个用逗号分隔值的字符串。

    【讨论】:

    • 我删除了括号,仍然没有任何区别,因为它处理了扩展,这不是问题。关于查看您链接的 StackOverflow 帖子,我已经阅读了大约十几遍。帖子中没有回答这个问题,而是沃德说“我需要一个复制品!”根据 Breeze 文档,实体实现的流程是这样的:当 Breeze 通过查询或实体导入实现对象时,顺序为 1. 构造函数 2. 初始化函数 3. 合并到缓存 考虑到这个流程,变量设置为 '',但是合并数据的时候应该填。
    • 更新:我实际上切换回括号,因为我使用它们是正确的。要扩展多个关系或导航属性,是一个数组,需要如此。参考这里:stackoverflow.com/questions/14235727/…
    • 这个问题是一月份的问题,请参考官方 API 文档 HERE -breezejs.com/sites/all/apidocs/classes/…
    • 注意,两种方式都适用于展开。 1. .expand("WO_RtHelp.WO_Rout, WO_RtHelp.WO_Rout.eqptmast") ||或|| .expand(["WO_RtHelp.WO_Rout", "WO_RtHelp.WO_Rout.eqptmast"])
    猜你喜欢
    • 2012-12-06
    • 2013-05-20
    • 2012-12-18
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    相关资源
    最近更新 更多