2016-03-25 18 views
3

Yapması ve DOM manipülasyonu için özel hizmetlerini kullanmak ve benim sorum da bu durumda ilgilidir UI farklı bölümlerinde aynı işlevselliği paylaşmak için angularjs yaygın bir uygulamadır ve şu şekilde olmaktadır: bir kenar çubuğu vardırAçısal servis değişiklikleri başka bir yerde nasıl ele alınabilir?

Uygulamamdaki bileşen ve tıklamadaki kenar çubuğunu en aza indirmek için bir düğme ama problem onların denetleyicilerinin farklı olmasıdır, bu yüzden sidebarService adlı aynı modülde bir hizmet oluşturdum ve bu hizmeti her iki denetleyiciye de enjekte ettim ancak veriler hizmette değişirken bir denetleyici tarafından bir olay Başka bir denetleyicide işleyemiyorum, bu nedenle nasıl yapılır:

app-module.js

(function() { 
    'use strict'; 

    var app = angular.module('app', []); 

}); 

kenar-service.js

(function() { 
    'use strict'; 

    angular.module('app') 
    .factory('sidebarService', function() { 

    var showClass = false; 

    return { 

     toggle: function() { 
     showClass = !showClass; 
     }, 

     isClassShown: function() { 
     return showClass; 
     } 

    }; 
    }); 

}); 

uygulama-controller.js

(function() { 
    'use strict'; 

    angular.module('app') 
    .controller('App', ['sidebarService', function(sidebarService) { 

    var appVm = this; 

    appVm.isClassShown = function() { 

     return sidebarService.isClassShown(); 

    }; 

    }]); 

}); 

Navbar'ın controller.js

(function() { 
    'use strict'; 

    angular.module('app') 
    .controller('Navbar', ['sidebarService', function(sidebarService) { 

    var navbarVm = this; 

    navbarVm.toggleSidebar = function() { 

     sidebarService.toggle(); 

    }; 
    }]); 

})(); 

index.html

<!DOCTYPE html> 
<html ng-app="app"> 
<head> 
    <title>My App</title> 
    <!-- ... --> 
</head> 
<body ng-controller="App as app"> 
    <ul ng-controller="Navbar as navbar"> 
    <li> 
     <a href="#" ng-click="navbar.toggleSidebar()">Toggle Sidebar</a> 
    </li> 
    <!-- ... --> 
    </ul> 
    <div class="sidebar" ng-class="{mini:app.isClassShown()}"> 
    <!-- ... --> 
    </div> 
</body> 
</html> 

cevap

0

Ayrıca, AngularJS kapsamları prototipik miras konseptini kullanırken, ana kapsamınızın bir özelliğini kullanmak için karşı karşıya kaldığınız sorun için küçük bir çözümdür ve ana kapsam özelliğiniz çocuk kapsamlarında kullanılabilir ancak Çocuk kapsamından değişiklikler yaptığınızdan ve ebeveyn kapsamındaki değişikliklerin de JavaScript nesnelerine dayalı kapsam özelliklerini kullandığından emin olun.

Bu konuyla ilgili daha fazla bilgi için here'u okuyabilirsiniz.

app-denetleyici:

Yani benim açıklama ve önerisine göre aşağıdaki gibidir yapın.js

(function() { 
    'use strict'; 

    angular.module('app') 
    .controller('App', ['$scope', function($scope) { 

    $scope.someObj = { 

     sidebarClass: false 

    }; 

    }]); 

}); 

index.html

<!DOCTYPE html> 
<html ng-app="app"> 
<head> 
    <title>My App</title> 
    <!-- ... --> 
</head> 
<body ng-controller="App as app"> 
    <ul ng-controller="Navbar as navbar"> 
    <li> 
     <a href="#" ng-click="someObj.sidebarClass = !someObj.sidebarClass">Toggle Sidebar</a> 
    </li> 
    <!-- ... --> 
    </ul> 
    <div class="sidebar" ng-class="{mini:someObj.sidebarClass}"> 
    <!-- ... --> 
    </div> 
</body> 
</html> 
1

Eh, orada iki yolu:

Çözüm 1: oldukça kolay ve bu arada tipik açısal çözüm: Eğer gelen değeri izlemek $scope.$watch kullanabilirsiniz kontrol eden, denetleyici. Başka bir deyişle

$scope.$watch(function() { return sidebarService.isClassShown() }, function(newValue, oldValue) { 
    console.log(newValue, oldValue); 
}); 

, uygulamanız denetçide: Yani, sizin durumda size aşağıdaki Gözetmenin değerini izlemek istediğiniz her $scope eklemek gerekir

(function() { 
    'use strict'; 

    angular.module('app') 
    .controller('App', ['$scope', 'sidebarService', function($scope, sidebarService) { 

    var appVm = this; 

    appVm.isClassShown = function() { 

     return sidebarService.isClassShown(); 

    }; 

    $scope.$watch(function() { return sidebarService.isClassShown() }, function(newValue, oldValue) { 
     console.log('changed', newValue, oldValue); 
    }); 

    }]); 

}); 

Çözüm 2 : Açısal olayı atmak ve bu olayı dinlerken: özel bir olay yayınlamak için açısal $ emit işlevini kullanın. Ayrıca üçüncü parti bir kütüphane olayları fırlatmak için kullanılabilir, ben standart açısal olay sisteminden daha fazla tercih ederim.

İlgili konular