2

У меня есть угловое приложение и несколько модулей.
Как вы можете видеть ниже, я вызываю директиву, что в mod2, на mod1template.html.
myvar получает значение в mod1Ctrl
Но угловой инициализирующий дочерний элемент first и myvar пуст в контроллере mod2.
Когда я googled, есть некоторые решения, но все для моего дела.
pre post links работает, когда оба родителя и ребенка являются директивами, но мой mod1 не имеет никакой директивы.
Я не хочу передавать параметр как атрибутУгловое ожидание для родительского контроллера

Есть ли еще решения для моего дела?

mod1template.html: 
<div> 
<mod2-dir></mod2-dir> 
</div> 


angular.module("angApp.mod1", ["ngRoute"]) 
    .config(["$routeProvider", "$locationProvider", function ($routeProvider, $locationProvider) { 
     $routeProvider.when("/:myvar1/:myvar2\\_:id", { 
      templateUrl: "Angular/mod1template.html", 
      controller: "mod1Ctrl" 
     }); 

    }]) 
    .controller("mod1Ctrl", ["$routeParams", "$scope", "mod1DataService", function ($routeParams, $scope, mod1DataService) { 
     $scope.myvar = mod1DataService.myvar; 
     } 


angular.module("angApp.mod2", ["ngRoute"]) 
    .directive("mod2Dir", function() { 
     return { 
      restrict: "E", 
      templateUrl: "Angular/mod2template.html", 
      controller: "mod2Ctrl" 
     }; 
    }) 
    .controller("mod2Ctrl", ["$scope", function ($scope) { 
     alert($scope.myvar.Id); 
     } 
+0

Вы можете использовать $ broadcast или $ emit в зависимости от того, как установлен контроллер. –

+1

Большое спасибо, $ broadcast работал для меня. если вы опубликуете его как ответ, я могу принять –

+0

Я добавил ответ –

ответ

1

Вы могли бы использовать $ радиопередачу В вашем случае. При изменении значения $ scope.myvar часы будут запускать широковещательное событие и будут прослушиваться его дочерней областью.

angular.module("angApp.mod1", ["ngRoute"]) 
    .config(["$routeProvider", "$locationProvider", function ($routeProvider, $locationProvider) { 
     $routeProvider.when("/:myvar1/:myvar2\\_:id", { 
      templateUrl: "Angular/mod1template.html", 
      controller: "mod1Ctrl" 
     }); 

    }]) 
    .controller("mod1Ctrl", ["$routeParams", "$scope", "mod1DataService", function ($routeParams, $scope, mod1DataService) { 
     $scope.myvar = mod1DataService.myvar; 
     //asuming that service call is ajax that's why placing watch on on myvar 
     $scope.$watch('myvar', function(newVal, oldVal){ 
      if(newVal != oldVal) 
      $scope.$broadcast('parentControllerLoaded',newVal); //no need to use broadcast event using $rootScope 
     },true); 
    } 



angular.module("angApp.mod2", ["ngRoute"]) 
    .directive("mod2Dir", function() { 
    return { 
     restrict: "E", 
     templateUrl: "Angular/mod2template.html", 
     controller: "mod2Ctrl" 
    }; 
}) 
.controller("mod2Ctrl", ["$scope", function ($scope) { 
    $scope.$on('parentControllerLoaded',function(event, data){ 
     alert(data.id); 
     //you can directly access parent scope from here. 
     //alert($scope.$parent.myvar.Id) 
    }); 
} 
0

попробуйте использовать $ таймаут в mod2Ctrl:

вместо

alert($scope.myvar.Id); 

использование этого

$timeout(function(){ 
    alert($scope.myvar.Id); 
},1); 
+0

спасибо, но я не думаю, что $ timeout - лучший способ. когда я пробовал с задержкой таймаута с 1, это не сработало, чем я пытался с 500 работал. изменения задержки зависят от многих факторов. –

Смежные вопросы