Jaydata saveChanges()计算跟踪/更改的实体,但不发送批处理请求(使用OData v4 Provider和Web Api)

时间:2016-09-28 10:13:34

标签: angularjs jaydata odata-v4

通过使用jaydata,我将实体添加到具有深层实体对象嵌套的树结构中。

我将上层实体附加到上下文并编辑/添加/删除相关的子实体。最后,我使用带有promise的saveChanges()。

传递给promise的count-value表示所有已更改的实体都已正确计数,但saveChanges()没有执行批处理请求,持久存储这些实体。

所以感觉就像没有其他事情发生,但计算实体。

我发布了一个小代码示例。我很确定,entites的引用设置正确。 (使用jaydata,odata v4,web api和angularjs)

其他人是否有jaydata这个问题,并找到了原因?

感谢您的帮助。 =)

问候保罗

// Attach upper entity
DataService.jaydata.attach(viewModel.currentSkillTree.entity);

// Generating new entities
var newSkill = new DataService.jaydata.Skills.elementType({
    Id: undefined,
    Name: 'New skill',
    Levels: [],
    IconId: 47,
    SkillTreeUsage: []
});

var newSkillLevel = new DataService.jaydata.SkillLevels.elementType({
    Id: undefined,
    ShortTitle: 'New level',
    Skill: newSkill,
    SkillId: undefined,
    Level: 1,
    RequirementSets: []
});

var newRequirementSet = new DataService.jaydata.RequirementSets.elementType({
    Id: undefined,
    SkillLevel: newSkillLevel,
    SkillLevelId: undefined,
    SkillTree: undefined,
    SkillTreeId: viewModel.currentSkillTree.entity.Id,
});

var newSkillTreeElement = new DataService.jaydata.SkillTreeElements.elementType({
    Id: undefined,
    SkillTree: undefined,
    SkillTreeId: viewModel.currentSkillTree.entity.Id,
    Skill: newSkill,
    SkillId: undefined,
    Position: { X: x, Y: y }
});

// Completing object-references

viewModel.currentSkillTree.entity.Elements.push(newSkillTreeElement);

newSkill.Levels.push(newSkillLevel);

newSkill.SkillTreeUsage.push(newSkillTreeElement)

newSkillLevel.RequirementSets.push(newRequirementSet);

// Saving
DataService.jaydata.saveChanges()
.then(function (cnt) {

    console.log('Saved entities:', cnt);

    // The cnt-result in console is 4 
    // But no request was executed, nothing was saved 

}, function (exception) {
    console.log(exception); // Also no exception was thrown
});

1 个答案:

答案 0 :(得分:0)

所以不要那么不友好。

解决上述问题的解决方案,因为我几乎尝试了与实体的每一个组合(添加,附加,.save(),. saveChanges(),对象引用等,弄清楚它无论如何都没有意义,它只是以同样的方式运行,似乎是如此的错误),最终在一个使用经典嵌套异步调用的解决方法。

解决方案是在嵌套的promises中单独保存实体并关闭jaydata的批处理行为,以避免双重请求。

您可以在$ data.defaults

中找到该选项

$ data.defaults.OData.disableBatch = true;

结果我正在处理好的旧的令人讨厌的厄运金字塔,这至少可以回归以正确的顺序保存实体,完全控制,api需要的方式。

      // Saving new SkillLevelRequirement connection
      if (isConnectionGiven === false) {

        // The first level of source skill where the target-skill-requirement will be added
        var sourceSkillLevel = Enumerable
          .From(sourceSkill.Levels)
          .FirstOrDefault(null, function (x) {
            return x.Level === 1;
          });

        // The last level of the target-skill to solve
        var targetSkillLevel = Enumerable
          .From(targetSkill.Levels)
          .FirstOrDefault(null, function (x) {
            return x.Level === targetSkill.Levels.length;
          });

        // First set of first level from source skill (will be used to add skilllevel-requirement)
        var firstRequirementSet = sourceSkillLevel.RequirementSets[0];

        // New RequirementAsignment
        var newRequirementAssignment = new DataService.jaydata.RequirementAssignments.elementType({
          RequirementSetId: firstRequirementSet.Id,
          Order: 1
        });

        // New Requirement
        var newRequirement = new DataService.jaydata.Requirements.elementType({
          Title: requirementTypes.SKILL_CONNECTION,
          RequirementOfIntId: undefined,
          RequirementOfBoolId: undefined,
          RequirementOfSkillLevelId: 0
        });

        // New RequirementOfSkillLevel
        var newRequirementOfSkillLevel = new DataService.jaydata.RequirementsOfSkillLevel.elementType({
          SkillLevelId: targetSkillLevel.Id,
        });

        // Loading symbol
        showBusyIndicator();

        newRequirementOfSkillLevel.save()
        .then(function () {
          newRequirement.RequirementOfSkillLevelId = newRequirementOfSkillLevel.Id;
          newRequirement.save()
          .then(function () {
            newRequirementAssignment.RequirementId = newRequirement.Id;
            newRequirementAssignment.save()
            .then(function () {

              // Loading symbol will be closed after tree reloaded
              reloadCurrentTree();

            }, function (exception) {
              showJayDataExceptionModal(exception);
            });
          }, function (exception) {
            showJayDataExceptionModal(exception);
          });
        }, function (exception) {
          showJayDataExceptionModal(exception);
        });

      }
    }

@jaydata开发者:感谢42个新的白发。我仍然处于我认为我使用你的工具错误的地方,jaydata可以做得更好。非常好地提高你的文档。今天没有甜点给你。

相关问题