9

Direktifimdeki bazı varsayılan değerleri İzolat kapsamı ile belirtmeye çalışıyorum. Temel olarak, yönergem yönlendirildiğinde kapsam nesnesini kullanarak bazı DOM manipülasyonları yapmam gerekiyor.AngularJS: Yönergesi, izolat kapsam nesnelerine erişemiyor

Kontrolör:

angular.module('ctrl').controller('TempCtrl', function($scope, $location, $window, $timeout, RestService, CommonSerivce) { 

$scope.showAppEditWindow = function() { 
    //Binding the directive isolate scope objects with parent scope objects 
    $scope.asAppObj = $scope.appObj; 
    $scope.asAppSubs = $scope.appSubscriptions; 

    //Making Initial Settings 
    CommonSerivce.broadcastFunction('doDirectiveBroadcast', ""); 
}; 

Hizmeti:

angular.module('Services').factory('CommonSerivce', function ($rootScope) { 
return {  
    broadcastFunction: function(listener, args) { 
     $rootScope.$broadcast(listener, args); 
    } 
}; 

Yönergesi:

angular.module('directives').directive('tempDirective', function() { 
return { 
    restrict : 'E', 
    scope:{ 
     appObj:'=asAppObj', 
     appSubs: '=asAppSubs' 
    }, 
    link : function(scope, element, attrs) {}, 
    controller : function ($scope,Services,CommonSerivce) {   
     //Broadcast Listener 
     $scope.$on('doDirectiveBroadcast', function (event, args) { 
      $scope.setDefaults(); 
     }); 

     $scope.setDefaults = function() { 
      //Setting Default Value 
      alert(JSON.stringify($scope.appSubs)); //Coming as undefined    
     }; 
    }, 
    templateUrl:"../template.html" 
    }; 
}); 

Özel Yönergesi elemanı:

<temp-directive as-app-obj="asAppObj" as-app-subs="asAppSubs" /> 
Aşağıda benim kodudur

Sorun şu ki, direktif kapsamındaki varsayılan yöntemde izolat kapsamına erişmeye çalışırken, veriler gelmekte ve DOM'a bağlı hale gelirken tanımsız bir değer elde etmem gerekiyor. İzleyici kapsamına yayın dinleyicisine nasıl erişebilirim ve yönlendirme şablonu HTML'sini nasıl değiştirebilirim? Bunu işlemek için başka bir şey var mı?

+0

Bir keman oluşturabilir misiniz? – AlwaysALearner

cevap

18

sorundur: açısal o zaman onun bağlamaları henüz güncelleme yok.

Böyle senin değişkenleri erişmek olmamalı, (örneğin $ saatini kullanarak) görünüme bağlamak için bir mekanizma bağlama açısal js kullanmaya çalışın. ebeveyn kapsamı değişkenlere Bağlama sadece değişiklikleri işler ve diğer değişkenleri veya görünümünüzü güncellemek,pasif oldukları anlamına geliyor. Açısal olarak böyle çalışmalıyız.

Hala buna erişmeniz gerekiyorsa. Sen $ timeout

$scope.setDefaults = function() { 
    $timeout(function() { 
     alert(JSON.stringify($scope.appSubs)); //Coming as undefined 
    },0);   
}; 

DEMO

O $ saatini kullanarak

angular.module('ctrl', []).controller('TempCtrl', function ($scope, $location, $rootScope) { 
     $scope.appSubscriptions = "Subscriptions"; 
     $scope.appObj = "Objs"; 
     $scope.showAppEditWindow = function() { 
      //Binding the directive isolate scope objects with parent scope objects 
      $scope.asAppObj = $scope.appObj; 
      $scope.asAppSubs = $scope.appSubscriptions; 

     }; 
    }); 

    angular.module('ctrl').directive('tempDirective', function() { 
     return { 
      restrict: 'E', 
      replace: true, 
      scope: { 
       appObj: '=asAppObj', 
       appSubs: '=asAppSubs' 
      }, 
      link: function (scope, element, attrs) { 

      }, 
      controller: function ($scope, $timeout) { 
       $scope.$watch("appSubs",function(newValue,OldValue,scope){ 
        if (newValue){ 
         alert(JSON.stringify(newValue)); 
        } 
       }); 
      }, 
      template: "<div>{{appSubs}}</div>" 
     }; 
    }); 

DEMO

izlemek $ kullanmak daha iyidir kullanarak geçici bir çözüm deneyebilirsiniz, sen yayın gerekmez Bu durumda olayınız. Bir bağlı bir fonksiyonun içinde

onun sadece ng tıklama: Bir sonraki etkinliğe için ihtiyacınız olduğunda yönerge kontrolör ilk örneğini ancak muhtemelen onun mevcut gibi zaman

+3

@Akhilesh Aggarwal: Bunun için $ watch kullanmalısınız. Benzer bir soruna bakın http://stackoverflow.com/questions/19142409/angular-directives-and-scope/19204970#19204970 –

+1

@Khank Kime: Bu daha da iyidir :).'Izle' tanımının 'bağlantı' içine eklenmesinin belirli bir nedeni. Ben de test ettim ve 'kontrolör' altında çalışıyor. –

+0

@Akhilesh Aggarwal: Senin durumunda, ben 'controller' içinde $ watch kullanmalısınız düşünüyorum. Denetleyici mantığınızı içermeli ve bağlantı işlevi yalnızca model ile görünüm arasında dinamik bir bağlantı kurmaya özen göstermelidir –

1

Büyük olasılıkla izole kapsam değişken kullanılamaz Direktifin denetleyicisi yüklendiğinde yarış durumu ve nesne tam olarak gelmiyor

İlgili konular