如何在编译范围后运行控制器代码

时间:2016-01-28 09:15:35

标签: javascript angularjs asynchronous

我有一个路由器,当我转到网址时运行我的控制器:#/create。我已经像这样配置了它:

$routeProvider
    .when("/create", {
        templateUrl: "templates/create",
        resolve: {
            form: function () {
                return { fields: [] };
            }
        },
        controller: "createController"
    })

在这个控制器中,我在我的服务中异步加载了一些我的组件,并将它分配给相应的scope属性。

.controller(function ($scope, service /* other components */) {
    // code
    console.log($scope); // sometimes it gives $rootScope
    service.get().load([["forms"]], $scope); // the reaso I am passing the scope is that my service could assign loaded data to it
})

有时当我刷新页面时,我已经请求了模块,但是我没有将它们分配给范围。经过大量调试后我发现了问题。我在编译模板时遇到麻烦而不是$scope我得到$rootScope,所以我将模块分配给其他/不正确的范围。这里的问题是,如何在编译范围后运行我的控制器代码?

2 个答案:

答案 0 :(得分:1)

你永远不应该有$ rootScope而不是控制器范围。我认为没有正确配置。你应该检查一下:

  • 为您的控制器命名(我不会在您的示例中看到它)
  • 您的html代码上没有可以调用控制器的ng-controller
  • 永远不要尝试直接在JS代码中创建它

另一方面,您不应该为您的服务提供$ scope。最好使用回调。

您可以相应地更改控制器:

/* resolve values should be inject */
.controller("createController", function ($scope, service, form) {
    $scope.form = form;

    service.get().load(function(value) {
        $scope.someValues = value;
    });
})

答案 1 :(得分:0)

您应该使用承诺来解析您的数据。当您调用服务器获取数据时,它是一个异步操作。通常,服务返回承诺。您在解决承诺时分配数据。

 service.get().success( function(data,status,headers){
       $scope.something = data;
 });