将参数推送到angularjs中的URL

将参数推送到angularjs中的URL,angularjs,node.js,angular-ui-router,Angularjs,Node.js,Angular Ui Router,我正在制作一个angularjs应用程序,我必须将用户的公司名称推送到url。 例如,www.myapp.com/samsung或www.myapp.com/toyota 我的策略是首先检索用户的公司信息,获取公司名称,然后使用ui路由器的$stateParams将名称推送到url 我可以推送参数,但它不会改变url的形状。url与www.myapp.com一样 有人知道怎么弄清楚吗?谢谢 //main controller $rootScope.$on('$stateChangeSuccess

我正在制作一个angularjs应用程序,我必须将用户的公司名称推送到url。 例如,www.myapp.com/samsung或www.myapp.com/toyota

我的策略是首先检索用户的公司信息,获取公司名称,然后使用ui路由器的$stateParams将名称推送到url

我可以推送参数,但它不会改变url的形状。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',
  ...
  ...
})

如果您只想更改URL而不重新加载页面,则可以使用:

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

$location
窗口相等。location
可用于观察和更改url,无需重新加载。查看以了解更多信息。

如果您只想更改URL而不重新加载您可以使用的页面:

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

$location
窗口相等。location
可用于观察和更改url,无需重新加载。查看以获取更多信息。

UI路由器1.0及以上版本可以通过
Oneter
过渡挂钩实现这一点

钩子检查是否设置了参数值。如果未设置(为
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',
  });

这里有一个可用的插件:

UI路由器1.0及更高版本可以通过一个
oneter
转换挂钩实现这一点

钩子检查是否设置了参数值。如果未设置(为
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',
  });

这里有一个可行的例子:

我可以用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');
            });
        }],
    },
})

我可以实现我想要的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');
            });
        }],
    },
})


您只想在URL中附加字符串的代码段在哪里?加载一个状态?使所有状态都能使用动态字符串?我将把公司名称字符串附加到url。这里有一些例子。www.myapp.com/samsung。www.myapp.com/samsung/posts/create。www.myapp.com/samsung/posts/view/hello.您只想在URL中添加字符串的代码段在哪里?加载一个状态?使所有状态都能使用动态字符串?我将把公司名称字符串附加到url。这里有一些例子。www.myapp.com/samsung。www.myapp.com/samsung/posts/create。www.myapp.com/samsung/posts/view/hello。我将把公司名称推到所有其他URL上,以动态方式显示。@super温柔啊,我误解了,据我所知,这是不可能的,你将需要为每个公司名称单独的状态,或者url的参数需要在路由到状态之前而不是之后给出。这是令人伤心的消息。。。但我必须这么做。有没有其他方法可以实现这一点?据我所知,只有多个州可以实现这一点。我将把公司名称推到所有其他URL上,以动态方式实现。@superwinter啊,我误解了,据我所知,这是不可能的,你将需要为每个公司名称单独的状态,或者url的参数需要在路由到状态之前而不是之后给出。这是令人伤心的消息。。。但我必须这么做。有没有其他方法可以实现这一点?据我所知,只有多个州可以实现这一点。谢谢,这似乎是最有希望的答案!但是,在我的代码中,$transition$无法识别。它是否来自ui路由器以外的其他软件包?它在ui路由器1.0及以上版本中。。。我的原始代码似乎与1.0版本冲突。我有点害怕重建我所有的代码来让它工作。顺便说一句,我真的很感谢你的回答。当我将来做类似的项目时,它可能真的是一个很好的资源!谢谢,这似乎是最有希望的答案!但是,在我的代码中,$transition$无法识别。它是否来自ui路由器以外的其他软件包?它在ui路由器1.0及以上版本中。。。我的原始代码似乎与1.0版本冲突。我有点害怕重建我所有的代码来让它工作。顺便说一句,我真的很感谢你的回答。当我将来做类似的项目时,它可能真的是一个很好的资源!