restangular 保存忽略对 restangular 对象的更改
restangular save ignores changes to restangular object
我正在尝试对重新规范化的对象调用保存,但保存方法完全忽略了对对象所做的任何更改,它似乎绑定了原始未修改的对象。
当我 运行 在调试器中执行此操作时,我看到在我调用保存之前输入我的 saveSkill 方法(见下文)时,技能对象将反映我对其名称和描述所做的更改领域。如果我然后执行 "step into" 我会进入 Restangular.save 方法。但是,restangular.save 方法中的 'this' 变量有我的老本领,名称和描述与加载时的内容相同。它忽略了我对技能所做的更改。
我能看到这种情况发生的唯一方法是如果有人在保存时调用绑定,虽然我不能为什么矩形会那样做?我唯一的猜测是因为我调用了 $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(skill),如下所示:
$scope.saveSkill=function(skill) {
skill.save().then(function returnedSkill) {
toaster.pop('success', "YES!", returnedSkill.name + " saved.");
...(other irrelevant stuff)
};
如果重要的话,我有一个 addElementTransformer 挂钩,它 运行 是一个调用 skilll.addRestangularMethod() 的方法,用于将 getPeople 方法添加到所有技能对象。我没有包含代码,因为我怀疑它是否相关,但如果需要,我可以详细说明。
我让它工作了,虽然老实说我仍然不完全知道它为什么工作我知道我使用的修复程序。
首先,如评论中所述,restangular 确实将其所有方法绑定到原始 restangularizedObject。这通常是有效的,因为它只是为重新命名的对象设置了别名,只要您使用该对象,您的修改就会起作用。
这可能是 Restangular.copy() 与 angular.copy 的问题。 Restangualar.copy() 确保正确地重新规范化复制的对象,将 restangualr 方法重新绑定到新的副本对象。如果你只调用 Angular.copy() 而不是 Restangualar.copy() 你会得到像我上面的结果。
但是,我没有做该对象的任何副本(好吧,我保存了一个主副本以在取消被击中时恢复,但它使用了 Restangular.copy() 而且没有被使用在我的简单保存场景中)。
据我所知,我的问题是在 restangular promise 上使用 .$object 调用。我遍历了 restangular 足以看到它在承诺 returns 之后做了一些额外的逻辑 restangularizing 方法,但我没有达到遵循 $object 逻辑的地步。但是,将 $object 调用替换为除了保存返回结果外什么都不做的 then() 函数已经解决了我的问题。如果有人可以解释我如何愿意更新这个问题,但我不能证明使用工作时间来尝试进一步寻找已解决的问题,即使我真的想更好地理解原因。
我正在尝试对重新规范化的对象调用保存,但保存方法完全忽略了对对象所做的任何更改,它似乎绑定了原始未修改的对象。
当我 运行 在调试器中执行此操作时,我看到在我调用保存之前输入我的 saveSkill 方法(见下文)时,技能对象将反映我对其名称和描述所做的更改领域。如果我然后执行 "step into" 我会进入 Restangular.save 方法。但是,restangular.save 方法中的 'this' 变量有我的老本领,名称和描述与加载时的内容相同。它忽略了我对技能所做的更改。
我能看到这种情况发生的唯一方法是如果有人在保存时调用绑定,虽然我不能为什么矩形会那样做?我唯一的猜测是因为我调用了 $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(skill),如下所示:
$scope.saveSkill=function(skill) {
skill.save().then(function returnedSkill) {
toaster.pop('success', "YES!", returnedSkill.name + " saved.");
...(other irrelevant stuff)
};
如果重要的话,我有一个 addElementTransformer 挂钩,它 运行 是一个调用 skilll.addRestangularMethod() 的方法,用于将 getPeople 方法添加到所有技能对象。我没有包含代码,因为我怀疑它是否相关,但如果需要,我可以详细说明。
我让它工作了,虽然老实说我仍然不完全知道它为什么工作我知道我使用的修复程序。
首先,如评论中所述,restangular 确实将其所有方法绑定到原始 restangularizedObject。这通常是有效的,因为它只是为重新命名的对象设置了别名,只要您使用该对象,您的修改就会起作用。
这可能是 Restangular.copy() 与 angular.copy 的问题。 Restangualar.copy() 确保正确地重新规范化复制的对象,将 restangualr 方法重新绑定到新的副本对象。如果你只调用 Angular.copy() 而不是 Restangualar.copy() 你会得到像我上面的结果。
但是,我没有做该对象的任何副本(好吧,我保存了一个主副本以在取消被击中时恢复,但它使用了 Restangular.copy() 而且没有被使用在我的简单保存场景中)。
据我所知,我的问题是在 restangular promise 上使用 .$object 调用。我遍历了 restangular 足以看到它在承诺 returns 之后做了一些额外的逻辑 restangularizing 方法,但我没有达到遵循 $object 逻辑的地步。但是,将 $object 调用替换为除了保存返回结果外什么都不做的 then() 函数已经解决了我的问题。如果有人可以解释我如何愿意更新这个问题,但我不能证明使用工作时间来尝试进一步寻找已解决的问题,即使我真的想更好地理解原因。