Im using https://github.com/mgonto/angular-wizard to create an angular wizard whose steps can be called from route params:
etc.
So I've created this controller:
.controller('createOrganizer', ['$scope', 'WizardHandler' , '$routeParams',
function($scope,WizardHandler,$routeParams)
{
//$scope.data = {};
$step = $routeParams.step;
WizardHandler.wizard().goTo($step);
}])
The proper linking and routing were created correctly on app.js and the index.html
But when I get into the urls, I get this:
TypeError: Cannot call method 'goTo' of undefined
Is this the way to pre-select an angular-wizard step using url parameters?
================= Update =====================
I tried with something like this:
.controller('createOrganizer', ['$scope', 'WizardHandler' , '$routeParams', function($scope,WizardHandler,$routeParams) { $step = $routeParams.step;
$scope.$watch(WizardHandler.wizard(), function(step) {
WizardHandler.wizard().goTo($step);
});
}])
The idea is to ise watch to tell me when WizardHandler.wizard() is instantiated in order to call the .goTo method. With this controller im getting this error:
TypeError: Cannot set property 'selected' of undefined
Not sure if i am using watch correctly. I even tested the step variable and it is ok, showing the same value as the url.
================= Solved! =====================
var step = parseInt($routeParams.step); // Important, as routeParams returns an String: the wizardHandler uses either an integer number or a string name of step. So I am parsing the number to prevent confusion.
$scope.$watch(
function() {return WizardHandler.wizard();},
function (wizard) {
if (wizard) wizard.goTo(step);
});
I added an init(step) function that handles the initial values of some values i need and also prevents error caused by urls like .../step/SOMERANDOMSTRING
Thanks to GregL for your help!
From reading through the source code quickly, my first guess would be that you have used a <wizard>
element with a name
property specified, but you have not passed that same name to WizardHandler.wizard()
. In the code, if you don't specify a name argument to WizardHandler.wizard()
, it will use the default name, which is the name used by a <wizard>
with no name
attribute.
Since you are not getting back the wizard you are intending when you call WizardHandler.wizard()
, it resolves to undefined
and calling goTo()
will fail with the error you got.
At the very least, separate the getting of the wizard and the .goTo()
call to add a check in to make sure you got a valid wizard:
.controller('createOrganizer', ['$scope', 'WizardHandler' , '$routeParams',
function($scope,WizardHandler,$routeParams)
{
//$scope.data = {};
$step = $routeParams.step;
var wizard = WizardHandler.wizard();
if (wizard)
wizard.goTo($step);
}]);
There should probably be a var
keyword before that $step
assignment, too, and as a convention, only Angular core things should start with a $
, or jQuery selection variables.
EDIT: You could also try using a $watch()
to get notified when the wizard is loaded, however there is no guarantee that the $digest()
cycle will be called immediately after the wizard is loaded, so you would be relying on the assumption that the $apply/$digest cycle is run sometime after the wizard is correctly added to the WizardHandler
's cache.
You would do this like so:
.controller('createOrganizer', ['$scope', 'WizardHandler' , '$routeParams',
function($scope,WizardHandler,$routeParams)
{
//$scope.data = {};
$step = $routeParams.step;
$scope.$watch(function() {
return WizardHandler.wizard();
}, function (wizard) {
if (wizard)
wizard.goTo($step);
});
}]);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With