2017-01-16 62 views
0

我想提出一個angularjs應用的網址,我要推用戶的公司名稱,地址。例如,www.myapp.com/samsung或www.myapp.com/toyota。把參數在angularjs

我實現戰略是,首先檢索用戶的公司信息,並得到公司的名稱和使用的UI路由器的$ stateParams推名稱網址。

我能推的參數,但它不會改變URL的形狀。該網址就像www.myapp.com一樣。

有沒有誰知道如何計算出這個任意一個?由於

//main controller 
$rootScope.$on('$stateChangeSuccess', function (e, toState, toParams, fromState, fromParams) { 
toParams = {company: $scope.user.company.nickname};//$scope.user.company.nickname contains company's name 
}); 

//$stateProvider configuration 
$stateProvider 
.$state('home', { 
    url: '/:company', 
    ... 
    ... 
}) 
+1

代碼段在哪裏 – Laazo

+0

您只是想在URL中附加一個字符串?加載狀態?使所有的狀態與動態字符串一起工作? – DevDig

+0

我打算將公司名稱字符串附加到網址中。這裏有些例子。 www.myapp.com/samsung。 www.myapp.com/samsung/posts/create。 www.myapp.com/samsung/posts/view/hello。 – supergentle

回答

0

如果你想要做的是改變的URL無需重新加載頁面,您可以使用:

var nameOfCompany = "toyota"; 
$location.url('/nameOfCompany'); 

$locationwindow.location角的equvilant它可以用來觀察並更改網址,而不重裝。查看documentation瞭解更多信息。

+0

我打算將公司名稱動態地推送到所有其他網址。 – supergentle

+0

@Supergentle ahh我誤解了,據我所知,這是不可能的,你將需要爲每個公司名稱分開狀態,或者需要在路由到狀態之前給出url的參數。 – Callum

+0

這是個不幸的消息......但我必須這樣做。有沒有其他的方法來實現這一目標? – supergentle

1

UI-路由器1.0及以上的可與onEnter過渡鉤實現這一點。

如果參數值被設置或不鉤檢查。如果它沒有設置(是null),它會將轉換重定向到相同的狀態,但設置了參數值。

$stateProvider.state({ 
    name: 'company', 
    url: '/:companyName', 
    params: { companyName: null }, // default to null 
    onEnter: function ($transition$, $state, company) { 
     let params = $transition$.params(); 
     if (params.companyName === null) { // check if null. Get resolve and redirect 
     return $state.target("company", { companyName: company.name }); 
     } 
    }, 
    resolve: { 
     company: ($http) => 
      $http.get('company.json').then(resp => resp.data) 
    }, 
    component: 'company', 
    }); 

這裏有一個工作plunker:http://plnkr.co/edit/aSJh6QyBUymKmaFNsOS8?p=info

+0

感謝這似乎是最有希望的答案!但是,在我的代碼中,'$ transition $'無法識別。它是否來自ui-router之外的其他軟件包? – supergentle

+0

這是在UI-Router 1.0和以上 –

+0

嗯......它似乎像我的原代碼與1.0版本衝突。我有點害怕重建我所有的代碼以使其工作。順便說一句,我非常感謝你的回答。當我在將來做類似的項目時,這可能是非常好的資源! – supergentle

0

我能實現我想與UI路由器0.3X版本。代碼可能看起來很髒,但它可以像我想象的那樣工作。希望它可以幫助找到相同功能的人。

.state('home', { 
    url: '/:company', 
    params: {company: null}, 
    templateUrl: '/templates/home.html', 
    onEnter: ['error', 'auth', '$state', 'company', '$stateParams', function (error, auth, $state,  company, $stateParams) { 
     if (!auth.isLoggedIn()) { 
      return error.flash('Login is required.', 'login'); 
     } 
     try { 
      if ($stateParams.company === null || $stateParams.company !== company.nickname) { 
       $state.go('home', {company: company.nickname});  
      } 
     } catch (err) { 
      console.log('mop'); 
     } 
    }], 
    resolve: { 
     company: ['auth', 'error', function (auth, error) { 
      return auth.getMyCompany().then(function (res) { 
       return res.data; 
      }, function (err) { 
       error.flash(401, 'login'); 
      }); 
     }], 
    }, 
})