如何在不同模块中的控制器之间共享数据

时间:2016-08-27 01:46:00

标签: javascript angularjs datepicker angular-ui-bootstrap

我已下载Angular UI Bootstrap Datepicker,我需要访问其控制器以获取其范围。但我完全不知道怎么做而不编辑Datepicker中的代码,我认为不应该这样做。

所以我有自己的应用/模块myApp,我有一个控制器MyController,我需要访问UibDatepickerControllerUibDaypickerController,{ {1}} app / module。我不想更改ui.bootstrap.datepicker模块中的代码。

这基本上是the same problem我之前发布的,但我认为我已经想出了很多。 (这个花了50个小时:D)

This solution无法正常工作,因为您无法注入控制器,就像您可以注入服务一样。

这是我的设计:

控制器:

ui.bootstrap.datepicker

HTML:

function MyCtrl() {
var vm = this;
vm.dt = new Date();
vm.options = {
  ...
};
vm.refresh = function() {
  //returns initialized value all the time (current date)
  console.log(vm.dt);
  $("#calendar").data("$uibDatepickerController").refreshView();
}
};
angular.module('myApp')
   .controller('MyCtrl', MyCtrl);

2 个答案:

答案 0 :(得分:0)

你提供的服务如下:

app.factory('thisfactory',function(){
  var data = null;
  var get = function(){
    return data;
  }
  var save = function(newData){
    data = newData;
  }
  return {get:get,save:save}
});

然后您将工厂注入每个控制器并使用它来使用save和get方法来回传递数据

答案 1 :(得分:0)

如果您确实需要在另一个模块或控制器中访问View中设置的值。您可以执行Niles提到的操作,或者您可以设置一个手表然后进行广播,以便其他模块,控制器可以访问该值,但不能访问该参考。

(function(){
    angular.controller("testController", testController);
    angular.controller("otherController", otherController);

    testController.$inject = ["$scope", "$rootScope"];
    otherController.$inject = ["$scope"];

    function testController($scope, $rootScope) {
        var vm = this;
        $scope.$watch("vm.datePicker", function(newValue){
            $rootScope.$broadcast("DATEPICKER_CHANGED", newValue);
        });
    }

    function otherController($scope) {
        var vm = this;

        $scope.$on("DATEPICKER_CHANGED", function(event, obj) {
            console.log(obj);
        });
    }
})();