restangular save忽略对restangular对象的更改

时间:2015-04-14 15:17:26

标签: javascript angularjs restangular

我正在尝试在一个restangularized对象上调用save,但是save方法完全忽略了对该对象所做的任何更改,它似乎绑定了原始的未修改对象。

当我在调试器中运行它时,我看到当我在调用save之前输入我的saveSkill方法(见下文)时,技能对象将反映我对其名称和描述字段所做的更改。如果我然后“进入”我进入Restangular.save方法。但是,restangular.save方法中的'this'变量具有我的旧技能,其名称和描述与加载时的任何内容相同。它忽略了我对我的技能所做的改变。

我能看到这种情况发生的唯一方法就是有人在保存时调用了bind,虽然我不能为什么矩形会这样做?我唯一的猜测是因为我调用了$ object,但是在文档方面我找不到多少来证实这一点。

我担心我无法复制和粘贴,我的所有代码示例都是手工输入的,所以原谅任何明显的语法问题都是错别字。我不知道我需要描述的是什么,所以这里是缩短版本,如果需要,我可以重新输入更多内容:

state('skill.detail', {
    url: '/:id',
    data: {pageTitle: 'Skill Detail'},
    tempalte: 'template.tpl.html'
    controller: 'SkillFormController',
    resolve: {
         isCreate: (function(){ return false;}, 
         skill: function(SkillService, $stateParams){
             return SkillService.get($stateParams.id, {"$expand": "people"}).$object;
    },
  });

 my SkillService looks like this:

 angular.module('project.skill').('SkillService', ['Restangular, function(Retangular) {
   var route="skills";

   var SkillService= Restangular.all(route);

   SkillService.restangularize= function(element, parent) {
       var skill=Restangular.restangluarizeElement(parent, elment, route);
       return skill;
   };

   return SkillService;
 }];

在我的template.tpl.html内部,我将标准文本框绑定到名称和描述,以及一个保存按钮。保存按钮调用我的SkillFormController的saveSkill(技能),如下所示:

 $scope.saveSkill=function(skill) {
 skill.save().then(function returnedSkill) {
      toaster.pop('success', "YES!", returnedSkill.name + " saved.");
      ...(other irrelevant stuff)
  };

如果重要的话,我有一个addElementTransformer钩子,它运行一个方法,调用skilll.addRestangularMethod()来为所有技能对象添加一个getPeople方法。我不包括代码,因为我怀疑它是相关的,但如果需要,我可以详细说明它。

1 个答案:

答案 0 :(得分:1)

我让这个工作,虽然老实说我还不完全知道为什么它有效我知道我使用的修复。

首先,正如注释中所述,restangular确实将其所有方法绑定到原始的restangularizedObject。这通常有效,因为它只是对restangularied对象进行别名,只要你使用该对象,你的修改就会起作用。

这可能是Restangular.copy()与angular.copy的问题。 Restangualar.copy()确保正确地重新组合复制的对象,将restangualr方法重新绑定到新的复制对象。如果你只调用Angular.copy()而不是Restangualar.copy(),你会得到像我上面的结果。

然而,我没有做任何副本的对象(好吧,我保存了一个主副本,如果取消被击中,则恢复到,但是使用了Restangular.copy(),而且我没有使用它简单的保存方案)。

据我所知,我的问题是在restangular promise上使用。$ object调用。在一个承诺返回之后,我走过了一个非常有限的状态,看到它正在做一些额外的逻辑重新组合方法,但我没有达到遵循$ object逻辑的程度。但是,用then()函数替换$ object调用除了保存返回的结果之外什么也没做,这解决了我的问题。如果有人可以解释我希望如何更新这个问题,但即使我真的想更好地了解原因,我也无法利用工作时间来尝试进一步追捕固定问题。