【问题标题】:Pass parameter to Ressource's method callback将参数传递给 Ressource 的方法回调
【发布时间】:2016-02-03 14:07:23
【问题描述】:

如果我成功更新我的 API 中的某些内容,我正在尝试更改一些模型数据:

this.saveProject = function(project) {
  var editedProjectSupport = {
        /* some data */
  };
  SupportTimeTracks.update({id: project.backendId}, editedProjectSupport,
    function() {
      // There :
      project.department = controllerScope.edit.project.department;
      project.timetrack = controllerScope.edit.project.timetrack;
      growl.success('Project support successfully edited');
    },
    function(result) {
      growl.error('Project support couldn\'t be edited.');
      console.log(result);
    });
  this.edit.project = {};
  $scope.$broadcast('edit.project');
};

但我无法在我的成功回调function() 中访问project。无论如何要在参数或其他东西中传递它。

如何更新我的project.departmentproject.timetrack

从视图中调用函数,project 在函数中是本地的(尽管它引用了作用域中存在的元素)

【问题讨论】:

  • 我认为$resource返回一个特殊的promise对象;试试return SupportTimeTracks.update().$promise.then(function(result))
  • 这将允许我访问插入的数据,但不能访问仅存在于前端的 project 变量
  • 你不会在 then 函数中准确地做到这一点吗?
  • Afaik,promise/then 的上下文不同,这意味着我们无法访问外部数据。这也是为什么我有一个引用this 的全局controllerScope。资源方法也是如此(保存、删除、更新...)

标签: javascript angularjs api crud angular-resource


【解决方案1】:
this.saveProject = function(project) {

  SupportTimeTracks.update({id: project.backendId}, editedProjectSupport,
    function() {
      // There : if you are not *shadowing* project variable, you MUST have access to project variable.
    }
  );
};

你的函数是一个闭包,project 是一个在this.saveProject 中定义的变量,所以如果你没有在里面定义另一个同名的变量(遮蔽你的第一个变量)@987654324必须定义 @ 并使用您传递给 this.saveProject 的值,并且您可以访问它。

代码示例:

var closure = function(project){
  // I grab project var here
  setTimeout(function(){
    alert('there is no project shadowing: '+ project);
  }, 100);
};

closure('my project var');

var closureWithShadowing = function(project){
  // I grab project var here ... but
  setTimeout(function(){
    var project = 'I eat project variables'; // I have created a new var with the same name
             // so, I'm shadowing the original one.
    alert('project shadowing: '+ project);
  }, 500);
};

closureWithShadowing('my project var');

【讨论】:

  • 项目应该是 this 是什么意思?该函数是从视图中调用的,并且项目是一个绑定模型:<a class="clickable btn btn-sm btn-success" ng-click="t.saveProject(project)">。所以项目实际上是函数的本地
  • 我的意思是如果 this.saveProjectthis 引用了项目。
  • 我的示例已经在工作了......抱歉做了这么多的更改
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 2020-07-03
相关资源
最近更新 更多