为什么传递给指令的函数不更新范围变量?

时间:2015-08-18 12:11:10

标签: angularjs angular-directive

在这个AngularJS代码中:

http://jsfiddle.net/edwardtanguay/xfbgjun5/8/

我有一个范围函数addCustomer(),它不会更新范围变量score

.controller('mainController', function ($scope) {
    $scope.customers = ['First','Second','Third'];
    $scope.score = 'sdfkj';
    $scope.addCustomer = function() {
        $scope.score = 'this does not work';
        console.log('but it obviously gets here');
    }
    $scope.changeIt = function() {
        $scope.score = 'this works';
    }
    ...
})

我将函数addCustomer()作为add传递:

return {
  restrict: 'A',
    scope: {
        datasource: '=',
        add: '&'
    },
    link: link
};

然后在我的指令中调用它:

function addItem() {
    scope.add();
    items.push('new customer');
    render();
}

为什么范围函数addCustomer()没有更新范围变量score

1 个答案:

答案 0 :(得分:2)

看看你的小提琴你的问题就在这里:

element.on('click', function(event) {
    if(event.target.id === 'addItem') {
        addItem();
        event.preventDefault();
    }
});

通过做一个元素。你用角度来连接你自己的事件。这不起作用,你也需要这样做:

element.on('click', function(event) {
    if(event.target.id === 'addItem') {
        addItem();
        event.preventDefault();
        scope.$apply();
    }
});

这是因为如果以这种方式构建,“点击”会发生在角度之外。您还应该研究如何构建指令,因为这不是您构建它的方式(使用html变量然后添加它)。在您的指令代码中不应该有任何html(在特定情况下期望)。