Angularjs 角度指令:混合属性数据和ngModel

Angularjs 角度指令:混合属性数据和ngModel,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我很幸运地构建了共享作用域和隔离作用域的指令,但我很难找到正确的方法来实现这两个目标 我试图获取一个类似于上面的输入,并装订一个UL,ng在它之后的属性列表上重复。我有两个问题 1) 如何正确连接共享ng模型范围 2) 这个编译函数有什么不正确的地方吗 将隔离范围与ngModel混合是一个有文件记录的问题,请参阅以下部分的隔离范围陷阱部分: 孤立范围陷阱 请注意,如果您有一个具有隔离作用域的指令,则不能要求使用ngModel,因为将在隔离作用域而不是外部作用域上查找模型值。当指令更新模型值时,

我很幸运地构建了共享作用域和隔离作用域的指令,但我很难找到正确的方法来实现这两个目标

我试图获取一个类似于上面的输入,并装订一个UL,ng在它之后的属性列表上重复。我有两个问题

1) 如何正确连接共享ng模型范围

2) 这个编译函数有什么不正确的地方吗


将隔离范围与ngModel混合是一个有文件记录的问题,请参阅以下部分的隔离范围陷阱部分:

孤立范围陷阱 请注意,如果您有一个具有隔离作用域的指令,则不能要求使用ngModel,因为将在隔离作用域而不是外部作用域上查找模型值。当指令更新模型值时,调用ngModel.$setViewValue()将不会更新外部作用域上的属性。但是,您可以通过使用$parent来解决这个问题

利用这些知识和一些奇怪的范围实验,我提供了两个选项来实现您想要做的事情:

(1) 如上文所述,它使用$parent方法

<div ng-controller="MyCtrl">
  <div>
    <input ng-form type="text" ng-model="$parent.search" append-me terms="myTerms">
  </div>
  {{search}}
</div>

myApp.directive('appendMe', ['$compile', function($compile) {
    return {
        restrict: 'A',
        scope: {terms: '='},
        link: function(scope, element, attributes) { // linking function
            console.log(scope.terms);
            var template = '<p>test</p>' + 
                '<ul><li ng-repeat="term in terms">{{term}}</li></ul>' +
                '<p>hm…</p>'
            element.after($compile(template)(scope));
        }
    }
}]);

{{search}}
指令('appendMe',['$compile',函数($compile){
返回{
限制:“A”,
作用域:{terms:'='},
链接:函数(范围、元素、属性){//链接函数
console.log(范围、术语);
变量模板='测试

'+ “
  • {{term}}
”+ “hm.

” 元素($compile(template)(scope)); } } }]);
(2) 看到这一点,它不使用$parent,而是使用隔离作用域发布通过ngModel配置的搜索模型

<div ng-controller="MyCtrl">
    <div>
        <input ng-form type="text" ng-model="search" append-me terms="myTerms">
    </div>
    {{search}}
</div>

myApp.directive('appendMe', ['$compile', function($compile) {
    return {
        restrict: 'A',
        scope: {terms: '=', search: '=ngModel'},
        link: function(scope, element, attributes) { // linking function
            console.log(scope.terms);
            var template = '<p>test</p>' + 
                '<ul><li ng-repeat="term in terms">{{term}}</li></ul>' +
                '<p>hm…</p>'
            element.after($compile(template)(scope));
        }
    }
}]);

{{search}}
指令('appendMe',['$compile',函数($compile){
返回{
限制:“A”,
作用域:{terms:'=',搜索:'=ngModel'},
链接:函数(范围、元素、属性){//链接函数
console.log(范围、术语);
变量模板='测试

'+ “
  • {{term}}
”+ “hm.

” 元素($compile(template)(scope)); } } }]);
这两个选项似乎都很好。

关于#2,“我对这个编译函数做了什么错误?”

如果将编译器的代码段从

...
tElement.after(
    '<p>test</p>' + 
    '<ul><li ng-repeat="term in terms">{{term}}</li></ul>' +
    '<p>hm…</p>'
);
...
。。。
电话服务(
“测试

”+ “
  • {{term}}
”+ “hm.

” ); ...

。。。
电话服务(
“测试

”+ “
  • {{term}
”+ “hm.

” ); ...
ng repeat
将正确渲染。然而,我无法告诉你它为什么有效

我认为第二种选择是可行的。人们似乎忘记了他们只能读取其他指令的属性。
...
tElement.after(
    '<p>test</p>' + 
    '<ul><li ng-repeat="term in myTerms">{{term}}</li></ul>' +
    '<p>hm…</p>'
);
...