Unit Test Karma Jasmine SyntaxError: Parse error on "&" Angular Directive binding

Unit Test Karma Jasmine SyntaxError: Parse error on "&" Angular Directive binding

我在我的指令行得到 SyntaxError: Parse error,我想在其中使用来自父指令方法的“&”单向绑定

myApp.directive('datasourceDeleteBtn', [function() {
return {
    restrict: 'E',
    replace: true,
    template: '<a href="#">&#x2715</a>',
    scope: {
        datasourceIndex: '@',
        removeParentDiv: '&'
    },
    link: link
};

function link(scope, element, attr) {

    element.bind('click', function(event) {
        event.preventDefault();
        scope.deleteDatasource(scope.datasourceIndex);
    });

    // Notify parent directive
    scope.deleteDatasource = function(datasource_index) {
        // conditional stuff that happens not included
        // {} required for passing values to "&" parent scope method
        scope.removeParentDiv({datasource_index});
    };
}
}]);

HTML

 <parent-div ng-repeat> // this is just a mockup not literal
 <datasource-delete-btn datasource-index="{{$index}}" remove-parent-div="removeParentDiv()"></datasource-delete-btn>
 </parent-div>

通过 removeParentDiv

的 ng-repeat 的父级 div
    // parentDiv directive has this
    scope.datasources = [];
    scope.removeDatasourcePicker = function(index) {
        scope.datasources.splice(index, 1);  // ie take it out
    };

看来问题是 Jasmine 不喜欢 { }。删除括号会导致测试通过(由于 & 需要 {},所以会出现典型错误)。

You are getting error because you are passing json in wrong format in method

您没有从指令中正确调用指令范围 removeParentDiv: '&' 中传递的方法。因为你只做 scope.removeParentDiv({datasource_index}); 不会将索引参数传递给方法。

要使其正常工作,您需要进行一些更改。

  1. 指令元素方法应该是

    remove-parent-div="removeParentDiv(index)"
    
  2. 并且在从指令调用它时,通过具有 json 结构,其中 index 只是参数,datasource_index 是它的值。

    scope.removeParentDiv({index: datasource_index});
    
  3. click 事件调用 scope.deleteDatasource(scope.datasourceIndex); 方法后执行 运行 摘要循环,以便更新 scope 绑定。

    element.bind('click', function(event) {
        event.preventDefault();
        scope.deleteDatasource(scope.datasourceIndex);
        scope.$apply(); //to run digest cycle, to keep binding in sync
    });