没有隔离范围的指令中的双向数据绑定

时间:2017-03-13 10:02:13

标签: javascript angularjs

我有一个指令需要与使用隔离范围的指令一起工作。当然,这会引发这个错误:

Multiple directives asking for new/isolated scope

我的代码大致如下:

HTML:

<p custom_directive='variable' vendor_directive>Test</p>

JS:

app.directive('ExampleDirective',function() {
    return {
        restrict: 'A',
        scope: {
            exampleDirective: '='
        },
        link: function(scope,element,attributes){
            // manipulate scope.exampleDirective
        }
    }

    });

我已经尝试从我的指令中完全删除范围并使用以下内容:

scope.exampleDirective = scope.$eval(attributes.exampleDirective)

然而,这似乎只适用于对象,而我的目标是其他类型的变量。

如何实现这一目标?

3 个答案:

答案 0 :(得分:0)

请尝试以下代码:

&#13;
&#13;
<?php while($row = $result->fetch(PDO::FETCH_ASSOC)){ ?>
    <option><?= $row["team_name"]; ?></option>
<?php } ?>
&#13;
var myApp = angular.module('myApp', []);
myApp.controller('myController', ['$scope', function($scope){
  
}]);

myApp.directive('exampleDirective',function() {
    return {
        restrict: 'A',
        scope: {
            data:"="
        },
        template: 'In Directive :<div> <input type="text" ng-model="data"></div>',
        link: function(scope,element,attributes){
            // manipulate scope.exampleDirective
        }
    }
});
&#13;
&#13;
&#13;

答案 1 :(得分:0)

我在这里可以看到的问题是vendor_directive已经创建了一个隔离的范围,因此angular不允许您在相同的摘要周期中定义另一个隔离的范围。有两种方法可以解决这个问题 -

  • 首先,更复杂的是您装饰供应商指令以包含自定义指令的功能。这是更稳定和可信赖的方式。在此处查看装饰器的文档decorator

  • 第二种简单的方法是在attributes.exampleDirective变量上使用$ watcher并在每次更改时执行一个函数,这样它就会模仿你想要的双向绑定

希望这有帮助

答案 2 :(得分:-1)

试试这个:

app.directive('ExampleDirective',function() {
  return {
    restrict: 'A',
    bindToController: {
        exampleDirective: '='
    },
    scope: true,
    link: function(scope,element,attributes) {
        // manipulate scope.exampleDirective
    }
  }
});