Angularjs将控制器解析为字符串

Angularjs将控制器解析为字符串,angularjs,Angularjs,我编写角度控制器的风格如下(使用控制器名称而不是函数) 我现在需要的是在提供我想要定义的解决部分时: $routeProvider.when('/someroute', { templateUrl: 'partials/someroute.html', resolve: myController.resolve}) // THIS IS THE CRITICAL LINE 既然控制器被定义为一个名称,如何完成下面的部分 为了更详细地说明,我想在解析路由之前从

我编写角度控制器的风格如下(使用控制器名称而不是函数)

我现在需要的是在提供我想要定义的解决部分时:

 $routeProvider.when('/someroute', {
        templateUrl: 'partials/someroute.html', 
        resolve: myController.resolve}) // THIS IS THE CRITICAL LINE
既然控制器被定义为一个名称,如何完成下面的部分

为了更详细地说明,我想在解析路由之前从服务器加载一些数据,然后在控制器中使用这些数据


更新:更准确地说,我希望每个模块都有自己的“resolve”函数,在使用该控制器执行root之前调用该函数。中的解决方案(由Misko Hevery回答)完全符合我的要求,但我没有控制器作为函数,而是作为名称。

控制器定义和解析部分将在路由定义中单独指定

如果在模块级别定义控制器,则需要将其作为字符串引用,因此:

 $routeProvider.when('/someroute', {
        templateUrl: 'partials/someroute.html', 
        controller: 'myController',
        resolve: {
          myVar: function(){
            //code to be executed before route change goes here
          };
        });
上面的代码还显示了如何定义一组变量,这些变量将在路由更改之前解析。解析后,这些变量可以注入控制器,因此以上面代码段中的示例为例,您可以这样编写控制器:

.controller('myController', ['$scope', 'myVar', function($scope, myVar) {
            // myVar is already resolved and injected here
        }
    ]);

这段视频可能也会有帮助:

@pkozlowski.opensource的答案是可行的,但我真的不想弄乱我的路由和控制器,因为我总是将它与Yo Generator分开。实际上,我们也可以将controller和resolve(r)全部解析为
string
/name(非函数)

然后在您的路由文件中,应该添加此选项

$routeProvider.when('/someroute', {
    templateUrl: 'partials/someroute.html', 
    resolve: ['myModel'] //ALWAYS IN ARRAY)
});
$routeProvider.when('/myModelCombination', {
    templateUrl: 'partials/someroute2.html', 
    resolve: ['myModel'] //ALWAYS IN ARRAY)
});

.$routeProvider

@TruongSinh的答案对我来说很有用,而且比在路由器中增加功能要好得多。我对它进行了一些调整,因为它返回的是延迟对象,而不是实际解析的数据

$routeProvider.when('/someroute', {
    templateUrl: 'partials/someroute.html', 
    controller: 'SomeController',
    resolve: {
       myModel: 'myModel'
    }
});
这也行

var MyController = myApp.controller('MyController', ['$scope', 'myData', function($scope, myData) {
  // Some code here
}]);

MyController.resolve = {
  myData: ['$http', '$q', function($http, $q) {
    var defer = $q.defer();

    $http.get('/foo/bar')
      .success(function(data) {
        defer.resolve(data);
      })
      .error(function(error, status) {
        defer.reject(error);
      });

    return defer.promise;
  }]
};

@AndrejKaurin您可以向控制器和解析函数注入服务,如果这是您所要求的。。。你能更精确一点吗?在when()中,应该是
'myController',
控制器:'myController',?@MarkRajcok。已修复。@pkozlowski.opensource我收到一个关于myVarProvider的错误,未知。你知道为什么吗?你用的是什么版本?myModel工厂应该还承诺吗?那么,如何通过单个工厂(本例中为myModel)返回更多承诺?或者我应该为每个解决方案创建一个新工厂。是的,每个工厂应该返回一个且只有一个东西,要么是价值,要么是承诺,除非您想等待一切,然后以$q.all()返回所有内容。答案已编辑。这似乎不起作用。你能展示一把小提琴吗?能在这里发布你的整个解决方案吗?我正在尝试做同样的事情(在resolve上返回一个延迟的对象),但很难让它工作。谢谢
$routeProvider.when('/someroute', {
    templateUrl: 'partials/someroute.html', 
    controller: 'SomeController',
    resolve: {
       myModel: 'myModel'
    }
});
var MyController = myApp.controller('MyController', ['$scope', 'myData', function($scope, myData) {
  // Some code here
}]);

MyController.resolve = {
  myData: ['$http', '$q', function($http, $q) {
    var defer = $q.defer();

    $http.get('/foo/bar')
      .success(function(data) {
        defer.resolve(data);
      })
      .error(function(error, status) {
        defer.reject(error);
      });

    return defer.promise;
  }]
};