AngularJS指令隔离范围不更新父级

Ste*_*ord 6 javascript scope angularjs

我有一个带有模式绑定2路的指令,当通过ng-click调用save()方法时,父作用域不会更新,除非我调用$ scope.$ apply()然后抛出$ apply进行中错误.

我正在使用ngResource,并且该事件有一个监听器调用$ scope.model.$ save();

有解决办法吗?或者我做错了什么?

.directive('editable', function(){
    return {
        restrict: 'AE',
        templateUrl: '/assets/partials/editable.html',
        scope: {
            value: '=editable',
            field: '@fieldType'
        },
        controller: function($scope){

           ...

            $scope.save = function(){
                $scope.value = $scope.editor.value;
                $scope.$emit('saved');
                $scope.toggleEditor();
            };

        }
    };
})
Run Code Online (Sandbox Code Playgroud)

UPDATE

看起来它毕竟更新了父节点,但是在摘要完成之前发射了一些内容.我可以使用$ timeout强制它到堆栈的末尾,但感觉有点hacky.有没有更好的办法?

$scope.$on('saved', function(){
    $timeout(function(){
        $scope.contact.$update();
    }, 0);
});
Run Code Online (Sandbox Code Playgroud)

Cha*_*tin 1

你如何调用 $scope.save ?如果您使用 Angular 指令之一,例如 ng-click,Angular 将自动为您运行摘要循环,因此您无需调用 $scope.$apply()。在内部,Angular 会在开始另一个周期之前检查摘要是否已经在进行中,因此如果您使用其中一个内置指令,它将为您处理已经在进行中的摘要问题。例如,将其放入指令的模板中......

<button ng-click="save()">Save</button>
Run Code Online (Sandbox Code Playgroud)

如果您需要从控制器或链接函数调用保存,您可以做一些修改来防止“摘要已在进行中”错误。使用 $timeout 服务将调用推迟到调用堆栈的末尾...

$scope.save();
$timeout(function() {
    $scope.$apply();
}, 0);
Run Code Online (Sandbox Code Playgroud)

我们将超时设置为 0,因此没有真正的延迟,但这仍然足以将 $apply 调用推到当前调用堆栈的末尾,这允许正在进行的摘要首先完成并防止错误。这并不理想,可能意味着您的设计存在更大的问题,但有时您只需要让它发挥作用