如何正确地观察变化

时间:2013-07-05 12:33:04

标签: javascript angularjs

我有一个指令,一个控制器和一个提供者:

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

note.controller('noteController',function($scope,$note){
    $scope.queue = $note.getQueue();
});

note.directive('note',function($note){
  return{
    restrict: 'A',
    template:
        '<div ng-repeat="notification in queue">' +
            '<p>{{notification.message}}</p>' +
        '</div>',

    link: function(scope,element,attr, noteController){
        noteController.$watch($note.queue,function(){
            scope.queue = $note.getQueue();
        })
    },
    controller: 'noteController'
  }
 });

note.provider('$note',function(){

  this.$get = function($timeout){

    var queue = [];

    function note(){
    }

    note.prototype.show = function(msg){

        var notification = {
            'message': msg
        };

        queue.push(notification);
    };

    return{
        getQueue: function(){
            return queue;
        },
        note: function(){
            return new note();
        }
    }
  }
})

在我的应用程序主模块中,我注入了提供者和笔记模块。

我创建了note的实例并启动它的show()方法。这很好用,正在显示音符。

但是,如果我在另一个extern模块中执行完全相同的操作,则notecontroller.queue将不会更新。

我创建了一个简单的plnkr来显示问题:

http://plnkr.co/edit/dtPF4rBocLw9gWrmO3cP?p=preview

1 个答案:

答案 0 :(得分:1)

您在问题中发布的代码与您遇到的问题无关,问题出在您的验证工具中,您正在调用preventDefault()。取消了input元素的默认行为,并且您没有手动调用$digest,因此没有任何内容可以触发摘要循环。

两种解决方案:

  1. 删除e.preventDefault();
  2. scope.$digest()处理程序
  3. 中致电keydown

    http://plnkr.co/edit/HtjnNmored70rAPOOMg6