2017-01-01 13 views
0

我試圖將代碼vm.canGoForward從我的控制器移到一個服務來隱藏實現細節。v2.canGoForward不是函數

代碼之前,更改

這工作得很好。

查看:

<button ng-disabled="!vm.canGoForward()" class="btn btn-primary" name="next" type="button" ng-click="vm.gotoStep(vm.currentStep + 1)"> 

控制器:

var vm = this; 
vm.currentStep = 1; 
vm.steps = WizardService.getWizardSteps(vm.formData); 

vm.canGoForward = function() { 
    var res = true, 
    i, 
    nextStateIndex = vm.currentStep + 1; 

    if (nextStateIndex > vm.steps.length) { 
    return false; 
    } 
    for (i = 1; res && i <= nextStateIndex; i++) { 
    res = (res && vm.steps[i-1].isReady()); 
    } 

    return !!res; 
}; 

服務

後代碼變更

查看

保持不變

控制器

var vm = this; 
vm.currentStep = 1; 
vm.steps = WizardService.getWizardSteps(vm.formData); 
vm.canGoForward = WizardService.canGoForward(vm.currentStep, vm.steps); 

服務

var wizardService = { 
    getWizardSteps: getWizardSteps, 
    canGoForward: canGoForward 
}; 
return wizardService; 

function getWizardSteps(formData) { 
    var wizardSteps = [ 
    { 
     step: 1, 
     name: 'Name', 
     template: 'views/wizard/step1.html', 
     isReady: function() { return true; } 
    }, 
    { 
     step: 2, 
     name: 'Email', 
     template: 'views/wizard/step2.html', 
     isReady: function() { return formData.firstName && formData.lastName; } 
    }, 
    { 
     step: 3, 
     name: 'Job Category', 
     template: 'views/wizard/step3.html', 
     isReady: function() { return formData.email; } 
    } 
    ]; 
    return wizardSteps; 
} 

function canGoForward(currentStep, steps) { 
    console.log(steps); 

    var res = true, 
    i, 
    nextStateIndex = currentStep + 1; 

    if (nextStateIndex > steps.length) { 
    return false; 
    } 
    for (i = 1; res && i <= nextStateIndex; i++) { 
    res = (res && steps[i-1].isReady()); 
    } 

    return !!res; 
} 

我現在出現以下錯誤:TypeError: v2.canGoForward is not a function。我該如何解決它?

+0

它是VM或V2? – trincot

+0

它說v2具體'v2.canGoForward是不是一個函數在fn0(eval在編譯「# – methuselah

回答

1

在你的第二個版本,下面的行會居然當場打電話WizardService.canGoForward,不給它分配:

vm.canGoForward = WizardService.canGoForward(vm.currentStep, vm.steps); 

什麼被分配是通話,這顯然不是一個函數的返回值,因此,稍後嘗試呼叫時的錯誤消息。

如果你要分配的功能,並確保參數獲得通過時,它後來被稱爲,然後使用bind

vm.canGoForward = WizardService.canGoForward.bind(WizardService, vm.currentStep, vm.steps); 
+0

啊啊偉大的工作!非常感謝你 – methuselah

+0

不客氣;-) – trincot