【问题标题】:Angular doesn't call resolve in my routeAngular 没有在我的路由中调用 resolve
【发布时间】:2015-07-02 18:45:23
【问题描述】:

我是 Angular 的新手,我正在尝试了解基本知识 我的项目很平均。

我的路由器.js

router.get('/', function (req, res, next) {
    res.render('index', {});
});

我的 Angularfile.js

var app = angular.module('ibApp', ['ngRoute','ui.router']);

app.config([
    '$stateProvider',
    '$urlRouterProvider',
    function ($stateProvider, $urlRouterProvider) {
        $stateProvider.state('home', {
            url: '/',
            resolve: {
                foo: [function () {
                    console.log('inside')
                }]
            }
        });

        $urlRouterProvider.otherwise('home');
    }]);



app.controller("MyCtrl",['$scope',function($scope) {
    console.log("here!");
}]);

我的 index.html

 <link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.1/angular-route.min.js"></script>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.10/angular-ui-router.js"></script>
    <script src="/javascripts/angularApp.js"></script>

但是当我得到/(index)路由时,我没有console.log('inside'),而我只有console.log("here");

我也试过http://localhost:3000/#/,但我的问题仍然存在。

【问题讨论】:

  • 从函数中移除 [ ]。
  • 解决了吗?我试过了,但我有同样的问题
  • resolve 将函数返回给您的控制器,而不是函数的结果,并且由于该函数未命名,因此您无法在控制器中执行该函数。添加() 以确保函数执行。
  • Alert() 也不起作用?
  • @Claies 我错过了什么吗? resolve 确实运行函数,见the docs: "if function, then it is injection and the return value is treated as the dependency"

标签: javascript angularjs


【解决方案1】:

在您的情况下,Resolve 提供程序未执行该功能。函数本身作为依赖对象返回,因为该函数从未被调用。如果函数被调用,函数的返回值被视为依赖。

尝试:

resolve: {
    foo: [function () {
            console.log('inside')
          }()]
    }

注意函数声明末尾的() 以调用该函数。

您还可以返回带有名称的函数,并在控制器内部调用该函数。

请注意,发生这种情况的原因是因为 foo 没有作为解析对象提供函数(这将隐式执行函数并将结果分配给 foo),而是将 foo 声明为数组,函数就是foo[0]。您可以在控制器中以foo[0] 的形式调用该函数。

根据您的 cmets,您正在尝试执行服务功能并返回结果。在这种情况下,您应该确保该服务对模块可用,然后简单地调用它。没有必要像使用控制器声明那样尝试将服务注入到解析函数中。

即而不是这样做:

resolve: { 
    postPromise: ['users', function (users) {
        console.dir('here '+users);
        return users.getAll();
    }]

你可以这样做:

app.config([
'$interpolateProvider',
'$stateProvider',
'$urlRouterProvider',
'users',
function ($interpolateProvider, $stateProvider, $urlRouterProvider, users) {
...

resolve: { 
    allTheUsers: function (users) {
        console.dir('here '+users);
        return users.getAll();
}

http://plnkr.co/edit/FOgVgz5kvfuzPAAgtsVC?p=preview

【讨论】:

  • 我的问题有点复杂。在使用 $http 调用我的服务后,我希望得到解析的数据。你可以在这里找到代码pastebin.com/PDN9Arkd。我的解析没有调用我的服务,并且在我的控制器内部,我没有我的数据。
  • 再次,您将 postPromise 作为数组返回,'users' 作为 postPromise[0],您的函数作为 postPromise[1]。 this 不会调用函数,也不会提供 users 作为函数的参数(它不是依赖注入数组)。
  • @monkeyUser 我用我认为你可能想要达到的目标更新了我的答案。
  • 再次感谢。我正在尝试您的代码,但我没有看到 'here'+user
  • 我更新了函数以显示注入users的位置。
猜你喜欢
  • 2017-07-10
  • 2016-02-01
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多