3

我一直在构建我的第一个 SPA 应用程序,从 John Papa 的 Jumpstart 的伟大工作中跳出来。

我遇到的问题是,当我尝试通过微风执行扩展或简单地选择所有字段时,在我的子集合映射期间,微风出现了问题。newValue.entityAspect 未定义

如果我通过 select 子句通过我的 api 查询,一切都很好,如果我直接调用表,直接“位置”,我会在 chartVal 对象上得到导航错误。 在此处输入图像描述 在此处输入图像描述

var query = EntityQuery.from('Positions')
           //.select('id, endDate, gauge, hoursPerWeek, memberId, title, summary, startDate, totalHours, weightedHours, company, compensation')
             .where('memberId', '==', id)
             .expand('Company, ChartVals')
             .orderBy(orderBy.positions);

            return manager.executeQuery(query)
                .then(querySucceeded)
                .fail(queryFailed);

            function querySucceeded(data) {
                var list = partialMapper.mapDtosToEntities(manager, data.results, entityNames.position, 'id');
                if (observables) {
                    observables(list);
                }

上面的查询会成功,然后调用 MapDtosToEntities(由 John Papa 提供)

函数 mapDtosToEntities(manager, dtos, entityName, keyName, extendWith) { return dtos.map(dtoToEntityMapper);

        function dtoToEntityMapper(dto) {
            var keyValue = dto[keyName];
            var entity = manager.getEntityByKey(entityName, keyValue);
            if (!entity) {
                // We don't have it, so create it as a partial
                extendWith = $.extend({ }, extendWith || defaultExtension);
                extendWith[keyName] = keyValue;
                entity = manager.createEntity(entityName, extendWith);
            }
            mapToEntity(entity, dto);
            entity.entityAspect.setUnchanged();
            return entity;
        }

        function mapToEntity(entity, dto) {
            // entity is an object with observables
            // dto is from json
            for (var prop in dto) {
                if (dto.hasOwnProperty(prop) && prop !="entityAspect") {
                    entity[prop](dto[prop]); <-- tanks here on children
                }
            }
            return entity;
        }
    }


/// <summary>
/// TODO: Update summary.
/// </summary>
public class Position : PersistableObject
{
    public int CompanyId { get; set; }

    /// <summary>
    /// Weighted hours based on Half-Life.
    /// </summary>
    public int CreditMinutes { get; set; }

    public int? CompensationId { get; set; }

    public DateTime? EndDate { get; set; }
    /// <summary>
    /// Code to hold measure of completeness. 10 = complete 0 = not complete.  
    /// </summary>
    public int Gauge { get; set; }

    public int? HoursPerWeek { get; set; }

    public bool IsCurrent { get; set; }

    [StringLength(40)]
    public string LinkedInId { get; set; }

    [Required]
    public int MemberId { get; set; }

    [StringLength(40)]
    public string Title { get; set; }

    [StringLength(400)]
    public string WeightedWords { get; set; }

    /// <summary>
    /// Adjusted Experience score Based on half life
    /// </summary>
    public int Score { get; set; }

    [Required]
    [StringLength(2000)]
    public string Summary { get; set; }

    public DateTime StartDate { get; set; }

    public decimal? SalaryEnd { get; set; }

    /// <summary>
    /// Hourly salary - let users enter hourly, monthly, annual etc
    /// </summary>
    public decimal? SalaryStart { get; set; }

    public decimal TotalHours { get; set; }

    /// <summary>
    /// Total Man-hours Multiplied by Gauge reading
    /// </summary>
    public decimal WeightedHours { get; set; }

    public int VisibilityId { get; set; }

    public Company Company { get; set; }

    public Member Member { get; set; }

    public virtual Compensation Compensation { get; set; }

    public virtual ICollection<Project> Projects { get; set; }

    public virtual ICollection<Tag> Tags { get; set; } 

    public virtual ICollection<ChartVal> ChartVals { get; set; } 

}


public class ChartVal : PersistableObject
{
    [Required]
    [StringLength(40)]
    public string Key { get; set; }

    public double Value { get; set; }

    public string Percentage { get; set; }

    public int PositionId { get; set; }

    public virtual Position Position { get; set; }
}

感谢您花点时间查看我的问题。我很感激你的时间!

4

3 回答 3

1

我有一个类似的问题,一个具有“imageUser”导航属性的部分用户实体。

我刚刚将 John Papa 的 mapDtosToEntities“mapToEntity”函数更改为此,它似乎正在工作 - 我对这一切都是新手,所以我不能保证与保存更改相关的导航属性的完整性,但它肯定将关联映射为我创建了一个“imageUrl”计算属性,它检索第一个关联并将其显示在图像元素中(即眼见为实):

        function mapToEntity(entity, dto) {
            // entity is an object with observables
            // dto is from json
            for (var prop in dto) {
                if (dto.hasOwnProperty(prop)) {
                    if (typeof(dto[prop]) != "object") {
                        entity[prop](dto[prop]);
                    } else {
                        entity[prop] = ko.observable(dto[prop]);
                    }
                }
            }

            return entity;
        }
于 2013-06-01T01:20:33.590 回答
1

我也看到了这一点。我相信解决方案将涉及检测属性是否为集合并对其进行迭代以逐个添加项目。我没有尝试这样做,因为我仍在尝试确定这是否是正确的做法

我并不打算将其作为本身的答案,而是表明其他人遵循了与海报相同的轨道,并且会对社区对此的任何回应感兴趣。

于 2013-04-24T12:30:04.320 回答
0

最后,我最终放弃了 John Papa mapDtosToEntities 映射器方法,只是循环了我的收藏......

function querySucceeded(data) {
                var list = [];
                for(i = 0; i< data.results.length; i++)
                {
                    list.push(data.results[i]);
                }
                observables(list);
            }
于 2013-05-03T20:45:53.073 回答