AngularJS:更改自定义指令中的父范围值

时间:2015-01-10 06:38:32

标签: angularjs angularjs-directive

我是AngularJS的新手。我想实现一个支持" alert"的自定义指令。 (或说"通知"),例如当我成功更新用户信息时,页面上会出现一个小方框,上面写着"您的信息已成功更新",并在2秒左右后消失。

下面是我目前的代码(我使用Bootstrap作为模板,所以类" alert"就是为了这个原因):

angular.module('myApp', [])
  .directive('notification', ['$timeout', function ($timeout) {
    return {
      restrict: 'E',
      scope: {
        type: '=', // the type of the notification, i.e. it can be success, can be error and so on
        condition: '=' // if condition is evaluated to true in the parent scope, this notification bar will appear
      },
      replace: true,
      transclude: true,
      link: function (scope, element, attributes) {
        scope.$watch(scope.condition, function () {
          if (scope.condition) {
            $timeout(function () {
              scope.condition = false; // I wish to change the value in the parent scope
            }, 2000);
          }
        });
      },
      templateUrl: 'partials/notification'
    };
  }]);

在notification.jade中(我使用Jade作为模板引擎):

!= "<div class='alert alert-{{ type }}' ng-transclude ng-show='condition'>"
!= "</div>"

实际使用此通知指令:

notification(type='"success"', condition='submissionSuccess')
  span Your information has been successfully updated.

我想要做的是如下。在父$ scope中,我有一个名为&#39; submissionSuccess&#39;的变量,当Ajax对后端的调用成功时,它被设置为true。如果是真的,我会显示通知栏(因此ng-show =&#39;条件&#39;在Jade文件中),我想在一段时间后隐藏这个栏(这就是为什么我有$指令配置中的超时片段)。但是,似乎有一些错误。我无法在custom指令中更改parent $ scope.condition的值,因此通知栏不会自动隐藏。

我该如何解决这个问题?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这是基于原型的范围继承的工作原理。在指令实例化期间,指令必须在隔离范围内创建自己的condition属性。它在这里没有与父作用域的连接,因为它是在子作用域中定义的私有值(true / false)。它与原始值类似于“阴影”父类原型属性的事实有关。

我建议坚持使用更全面,更可靠的对象引用:

.directive('notification', ['$timeout',
    function($timeout) {
        return {
            restrict: 'E',
            scope: {
                config: '='
            },
            replace: true,
            transclude: true,
            link: function(scope, element, attributes) {
                scope.$watch('config.condition', function() {
                    if (scope.config && scope.config.condition) {
                        $timeout(function() {
                            scope.config.condition = false; // I wish to change the value in the parent scope
                        }, 2000);
                    }
                });
            },
            templateUrl: 'partials/notification.html'
        };
    }
]);

然后模板将成为:

<div class="alert alert-{{ config.type }}" ng-transclude="" ng-show="config.condition"></div>

<notification config="config">
    Some message here.
</notification>

演示:http://plnkr.co/edit/M0iSjHwFXXEACWf79zW7?p=preview