【问题标题】:Angularjs route resolve not populating model before loading controllerAngularjs路由在加载控制器之前解析不填充模型
【发布时间】:2014-08-08 10:29:40
【问题描述】:

我正在尝试在我的控制器加载之前从后端(带有标签和消息)填充我的模型。我的方法运行良好,它与后端连接并获取数据,但是当我在控制器中查看该变量时,它是未定义的。我的变量是“模型”

这是我的路线文件

mainApp
    .config(["$routeProvider", function ($routeProvider) {
        .when(AngularRoutesFactory.AIMSAdmin.SearchBookings, {
              templateUrl: aimsAdminViewBase + "Bookings/SearchBookings.html",
              controller: "SearchPerioperativeBookingController",
              resolve: {
                  "Model": function (BookingFactory) {
                      return BookingFactory.GetSearchModel();
                  }
              },
              requireAIMSAuthorizeUser: true
          })
          .otherwise({
              redirectTo: AngularRoutesFactory.MainApp.BaseUrl
          });
    }]);

我的工厂是

mainApp.factory("BookingFactory", ["$location", "MainFactory",
function ($location, MainFactory) {
 bookingsFactory.GetSearchModel = function () {
        bookingsFactory.MainFactory.QueryAPI(apiEndpoint + "GetSearchModel", "GET", function (response) {
            bookingsFactory.SearchBookingCriteria = response;
            return bookingsFactory.SearchBookingCriteria;
        }, null, null, bookingsFactory.LangInfo.Message_GettingBookingModel);
    }
 return bookingsFactory;


}]);

这是我的控制器

mainApp.controller("SearchBookingController", ["$scope", "BookingFactory", "$rootScope", "$location"
, function ($scope, BookingFactory, $rootScope, $location, Model) {
    $scope.bbb = Model;

}]);

【问题讨论】:

    标签: angularjs angular-ui-router


    【解决方案1】:

    编辑:

    尝试这样处理:

    mainApp.config(["$routeProvider", "$q", function ($routeProvider, $q) {
        .when(AngularRoutesFactory.AIMSAdmin.SearchBookings, {
              templateUrl: aimsAdminViewBase + "Bookings/SearchBookings.html",
              controller: "SearchPerioperativeBookingController",
              resolve: {
                  Model: function (BookingFactory, $q) {
    
                      var deferred = $q.defer();
                      BookingFactory.GetSearchModel().then(
                                function (data) {
                                    deferred.resolve(data);
                                }, function () {
                                    deferred.reject();
                                }
                            );
                      return deferred.promise;
                  }
              },
              requireAIMSAuthorizeUser: true
          })
          .otherwise({
              redirectTo: AngularRoutesFactory.MainApp.BaseUrl
          });
    }]);
    

    【讨论】:

    • 还没有定义..:(
    • 嗯,那么 BookingFactory.GetSearchModel();这是一个承诺吗?
    • 是的,这是因为我将我的函数传递给主工厂,主工厂执行该函数,然后我认为返回承诺
    • @AtulChaudhary 您需要确保从resolve 中返回该承诺。由于您在解析中调用了多个函数,因此这些函数中的每一个都需要返回承诺,直至并包括解析中使用的函数。
    • 这是否意味着我必须使用 $q 方法?
    【解决方案2】:

    在@Fedaykin 的指导下,提出了以下可行的解决方案。如有错误请告知

    我刚刚通过应用 $q.defer 方法更改了我的工厂方法和解析函数并让它工作

    使用以下代码更改了我的工厂 GetSearchModel 方法

    bookingsFactory.GetSearchModel = function () {
            bookingsFactory.MainFactory.QueryAPI(apiEndpoint + "GetSearchModel", "GET", function (response) {
                deferred.resolve(response);
            }, null, null, bookingsFactory.LangInfo.Message_GettingBookingModel);
            return deferred.promise;
        }
    

    我在路由文件中做了什么

    var bookingModel= function ($q, BookingFactory) {
        var deferred = $q.defer();
        BookingFactory.GetSearchModel().then(
                  function (data) {
                      deferred.resolve(data);
                  }, function () {
                      deferred.reject();
                  }
              );
        return deferred.promise;
    };
    bookingModel.$inject = ["$q", "BookingFactory"];
    

    然后解决我所做的一切

     .when(AngularRoutesFactory.AIMSAdmin.SearchBookings, {
                  templateUrl: aimsAdminViewBase + "Bookings/SearchBookings.html",
                  controller: "SearchBookingController",
                  resolve: {
                      "Model": bookingModel
                  },
                  requireAIMSAuthorizeUser: true
              })
    

    在控制器中我得到了值

    mainApp.controller("SearchBookingController", ["$scope", "InitializeMainFactory", "$rootScope", "$location", "Model"
    , function ($scope, InitializeMainFactory, $rootScope, $location, Model) {
    
        $scope.Model = Model;
    
    }]);
    

    【讨论】:

    • 就是这样!这与我发布的唯一区别是您将函数放入 bookingModel 变量中,如果您将其粘贴到解析部分,您将得到相同的结果:D
    • 你是绝对正确的。我这样做是为了支持缩小,我认为有角的人说这是一种很好的做法。
    • 太棒了!很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 2021-10-20
    • 2013-12-24
    • 2014-02-03
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多