我是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的值,因此通知栏不会自动隐藏。
我该如何解决这个问题?非常感谢任何帮助。
答案 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>