web-dev-qa-db-ja.com

「属性」の変更を「見る」ことは可能ですか

ディレクティブのUIの変更を「監視」することは可能ですか?そんな感じ:

.directive('vValidation', function() {
    return function(scope, element, attrs) {
        element.$watch(function() {
            if (this.hasClass('someClass')) console.log('someClass added');
        });
    }
})
54
iLemming

はい。属性で補間を使用する場合は、attr.$observeを使用できます。

しかし、これが補間された属性ではなく、アプリケーション内のどこかから変更されると予想される場合(非常に推奨されないもの、 Common Pitfalls )、$watch関数戻り値:

scope.$watch(function() {
    return element.attr('class'); 
}, function(newValue){
    // do stuff with newValue
});

とにかく、おそらくあなたにとって最良のアプローチは、要素クラスを変更するコードを変更することでしょう。どの瞬間に変更されますか?

86
Caio Cunha
attrs.$observe('class', function(val){});
38
Ketan

コントローラの変数を監視することもできます。

このコードは、他のモジュールがフィードバックメッセージを表示した後、通知バーを自動的に非表示にします。

HTML:

<notification-bar
    data-showbar='vm.notification.show'>
        <p> {{ vm.notification.message }} </p>
</notification-bar>

ディレクティブ:

var directive = {
    restrict: 'E',
    replace: true,
    transclude: true,
    scope: {
        showbar: '=showbar',
    },
    templateUrl: '/app/views/partials/notification.html',
    controller: function ($scope, $element, $attrs) {

        $scope.$watch('showbar', function (newValue, oldValue) {
            //console.log('showbar changed:', newValue);
            hide_element();
        }, true);

        function hide_element() {
            $timeout(function () {
                $scope.showbar = false;
            }, 3000);
        }
    }
};

ディレクティブテンプレート:

<div class="notification-bar" data-ng-show="showbar"><div>
    <div class="menucloud-notification-content"></div>
1
Marcin Rapacz