2017-03-14 69 views
0

我正在使用angular.js(v.1.XX)。如何调用承诺后的方法内部方法 - 角?

我有这个文件(组件):

class ReportsSiteController { 
    constructor ($log, $state, etc...) { 
    const vm = this; 
    } 

    $onInit() { 
    const vm = this; 
    // Some code 
    } 

    // Methods 
    submitForm(form) { 
    const vm = this; 
    // Some code 

    vm.SuperService.saveItem(vm.item) 
     .then( response => { 
     const vm = this; 
     // this method fails when called from here 
     vm.uploadLogo(response.id, vm.imgLogo); 
     }) 
     .catch() // etc 
    } 


    uploadLogo(id, file) { 
    // More code 
    } 
} 

当我调用该方法uploadLogo()失败。由于我认为范围错误(vmthis什么的),我无法访问uploadLogo方法。我试过vm,this,只是调用方法。但没有工作。 它看起来像一个错误的方式来做到这一点。

response.id被定义,并且它也是vm.imgLogo。我不能从那里拨打电话uploadLogo

更新:
这里是console.log(this)图像:https://i.stack.imgur.com/MHCL5.png

有什么建议?谢谢。

+1

什么'的console.log(本);'说明了什么? – Ryan

+0

这是一个对象,不知道它是什么。它没有可用的方法。 – jBaumann

+1

'console.log(this,this.constructor);'显示是否使其成为'submitForm'的第一行? – Ryan

回答

0

正在发生的事情是在你的then,这是全局对象,所以你重新声明VM到全局对象,你不需要做B/C它应该已经在封闭

submitForm(form) { 
    const vm = this; 
    vm.SuperService.saveItem(vm.item) 
     .then( response => { 
     const vm = this; 
     // this method fails when called from here 
     vm.uploadLogo(response.id, vm.imgLogo); 
     }) 
     .catch() // etc 
    } 

a. submitForm(form) { 
    b. const vm = this; 
    c. vm.SuperService.saveItem(vm.item) 
    d. .then( response => { 
    e.  vm.uploadLogo(response.id, vm.imgLogo); 
    f. }) 
    g. .catch() // etc 
    h. } 

更深的理论解释

这工作是导致javascript是函数作用域,并且this是任何正在调用该函数的东西。

一步一步

  1. 角呼叫yourInstance.submitForm,线b。将vm设置为此,这是您的实例
  2. saveItem被推入到c行中的堆栈。 (让我们假设它是在栈上唯一)执行
  3. saveItem(vm.item),当时thisSuperService因为该行是用c写有SuperService.saveItem(vm.item)
  4. 的当那saveItem解析成功,JavaScript的看跌期权微函数队列中的一个函数,该函数在函数d中传递给.then。这是一个匿名函数
  5. 由于没有别的堆栈上,匿名函数被执行,但没有来电显示这样this默认情况下
  6. JavaScript时看到vm这是在E线定义的全局对象。它没有在它本身或它的参数中找到对它的引用,所以它在它被声明的函数中看起来是否参考了在行b上声明的vm,并且引用了yourInstance
  7. 利润!

希望这会有所帮助,如果您想了解更多关于它这里有一些重要的资源

http://dmitrysoshnikov.com/ecmascript/chapter-3-this/ https://github.com/getify/You-Dont-Know-JS/tree/master/scope%20%26%20closures

+0

它的工作原理!真的,这很简单..但我现在对范围感到困惑。 – jBaumann

+1

太好了,会更新答案以帮助您/未来遇到的其他人。你能扩展你正在挂上哪一部分? – Austio

+0

不知道为什么这个'vm'没有'vm = this'。 或者,也许我现在。如果我改变箭头功能并使用正常功能,它应该失败呢? – jBaumann