1

It's possible to use a function as the templateUrl. The official documentation for $routeProvider states:

templateUrl – {string=|function()=}

$routeProvider official documentation

In javascript, a function has the syntax of:

function() {code here}

But the documentation shows:

function()=

Using function()=Code Here doesn't work. What is the syntax for using a function for the templateUrl in angularjs routing?

If I use something like:

when('/Store/:StoreId', {
      templateUrl: function()=webPages/Stores.php?storeID=' + :StoreId,
      controller: 'storeParseData'

This does not work. I guess that the URL match for :StoreId is automatically stored in $routeProvider. I've tried using $scope, $location, and $routeProvider in various different ways with no success. I'm looking for the simplest and most straight forward way to pass a URL # hash id to the templateUrl.

The reason I need to inject dynamic info into the templateUrl, is because the page I'm loading is a PHP file that runs PHP code when loaded. The PHP code retrieves info from the hash # URL. Retrieving the :StoreId in the controller won't help me. I want the PHP file to retrieve data from the server side rather than the front end JavaScript controller.

Here is the PHP code:

<?php
//There are two basic scenarios. 1) Get all Store names to populate the Store List
// 2) Get all the postings from a particular user, (store)
// If the URL has 'cat=something', then get all the store data
// If the URL does NOT have 'cat=something', then get the store data.

//Only get the store names if DIV with the store names is empty, otherwise
//just get the stores listings.

$storeNames = file_get_contents('https://NameOfDataURLHere.com/.json');

//information that was previously put into the URL string ending, is parsed with the following code.
$urlPiece = $_SERVER['REQUEST_URI'];
echo("url Piece: ".$urlPiece);
//find the position of the first character in the URL string with search criteria: 'storeID='.
//First the URL is checked for 'storeID='.  If 'storeID=' exits in the URL, then the page routing injected 'storeID='
//as a string for an argument to be passed.  If no argument was passed, then 'storeID=' string.
$posOfEqualSign = strrpos($urlPiece,"storeID=");
echo("<br>");
echo("posOfEqualSign: ".$posOfEqualSign);
echo("<br>");
//If the string 'storeID=' was found, it's okay to proceed.

if (isset($posOfEqualSign) && strlen($posOfEqualSign) > 0) {
  //the substr function in PHP doesn't need an length designation if you want the default to go to the end of the string.
  $storeID = substr($urlPiece,$posOfEqualSign + 8);
  echo("storeID Length: ".strlen($storeID));
  echo("<br>");
  echo("storeID: " . $storeID);
  echo("<br>");
}

if (isset($storeID) && strlen($storeID) > 3) {
  //get all listings for the store out of the listings database with the store ID
  //The store ID was retrieved from the URL.  The store ID was put into the URL when the user clicked the store name.
  $storeListings = file_get_contents('https://NameOfDataURLHere.com/'.$storeID.'/.json');
  $listingsDecoded=json_decode($storeListings,true);

  echo("storeListings: ".$storeListings);
  echo("<br>");

  if (strlen($storeListings) > 1) {
  foreach ($listingsDecoded as $key => $value) {
    //$keyValHere = "\"" . $key . "\"";

    //echo "keyValHere " . $keyValHere;
    echo"<br><br>";
    echo "Level 1 Key: " . $key;
    echo '<br><br>';

    $storeListingsData = array();

    foreach($value as $x=>$v) {
        echo "Level 2 Key: " . $x;
        echo"<br>";
        echo "Lelvel 2 value: " . $v;
        echo"<br>";
        $specificListing = substr($v, 4);
        $catToGetItemFrom = substr($v,0,3);
        echo 'The Listing ID: ' . $specificListing;
        echo"<br>";
        echo 'The category: ' . $catToGetItemFrom;
        if (strlen($catToGetItemFrom) > 0 && strlen($specificListing) > 1) {
          if (ord($catToGetItemFrom) <= 109) { //ord returns the ASCII value of the first character of a string
            $whatDB = "NameOfDBHere";
          } else {
            $whatDB = "NameOfSecondDBHere";
          }
          $oneStoreListing = file_get_contents('https://'.$whatDB.'.dataURL.com/'.$catToGetItemFrom.'/'.$specificListing.'/.json');
        } else {
          $oneStoreListing = "";
          echo('one store Listing: '.$oneStoreListing);
        }

        if (strlen($oneStoreListing) > 1) {
          //Keep adding single store listings to the array until the loop is done.
          array_push($storeListingsData, $oneStoreListing);
        }
    }
  }
}

echo '<br>';
echo('store Names: '.$storeNames);
echo('<br>');
echo('one store Listing: '.$storeListingsData);

}
?>

Data Injected Into A DIV with PHP for Later Retrieval:

    <br>

<div id="idCatName" style="display: inline"><?php echo $catToGetItemFrom;?></div>
<br>
<div id="idStoreNames" style="display: inline"><?php echo($storeNames);?></div>
<br>
<div id="idStoreData" style="display: inline"><?php echo($storeListingsData);?></div>

The Solution - With a Little Help From Others:

myApp.config(['$routeProvider',
   function($routeProvider) {

$routeProvider.
    when('/Store/:StoreId', {
        templateUrl: function(params){return 'webPages/Stores.php?storeID=' + params.StoreId;},
        controller: 'storeParseData'
     }).
     otherwise({ redirectTo:'/Home' });
  }]);
Alan Wells
  • 30,746
  • 15
  • 104
  • 152

2 Answers2

2
.when('/Store/:StoreId', {
    templateUrl: 'path/to/your/template/index.html',
    controller: 'MyController'
})

Then in MyController to read the parameter do

$scope.store_id = $routeParams.storeId;

Example here

Merlin
  • 4,907
  • 2
  • 33
  • 51
  • The web page I need to load is a PHP file. The PHP file retrieves information out of the hash at the end of the URL. Your method retrieves the hash information from the URL in the controller, it doesn't inject the `:StoreId` INTO the `templateUrl`. – Alan Wells May 14 '14 at 19:36
2
.when('/:storeId/private', {
    templateUrl: function(params) {return 'webPages/Stores' + params.storeId;},
    controller: 'storeParseData'
})
pocheptsov
  • 1,936
  • 20
  • 24
  • Okay, so it looks like I need to make sure that `return` is in the code so that the end value gets sent to the `templateUrl`. That makes sense. – Alan Wells May 14 '14 at 20:47