AngularJS: Transclusion创建新的作用域
AngularJS: Transclusion creates new scope
我创建了一个使用透传的新指令,并将scope属性设置为false(使用父范围)。虽然它可以从周围的作用域访问数据,但指令不能更新它。
请在这里的例子。当第一个文本框被修改时,对文本的所有绑定都会更新,但是当跨包含的文本框被修改时,只会修改同一范围内的引用。在我的例子中,我希望这两个文本框更新所有引用文本。
透入是否创建一个新的作用域?这种情况有办法预防吗?
示例代码:
HTML: <script type="text/ng-template" id="tmpl.html">
<ul>
<li>I want to stay here</li>
</ul>
</script>
<div ng-controller="MyCtrl">
<h2>{{text}}</h2>
<input type="text" ng-model="text"></input>
<mydirective>
<li><input type="text" ng-model="text"></input></li>
<li>{{text}}</li>
</mydirective>
</div>
JS:
angular.module('myApp', [])
.controller('MyCtrl',function($scope){
$scope.text = 'Somestring';
})
.directive('mydirective', function () {
return {
restrict: 'E',
transclude: true,
scope: false, //do not create a new scope
templateUrl: 'tmpl.html',
replace: false,
link : function(scope, element, attrs, ctrl, transclude){
element.find("ul").append(transclude());
}
};
});
这就是transclude的工作方式…这是无法阻止的…
问题是字符串是原始值,所以当你在子作用域更改它时,你是在为子作用域重写它,而不是在父作用域更新它。
有一篇关于作用域的好文章:
https://github.com/angular/angular.js/wiki/Understanding-Scopes要解决这个问题,您可以创建对象来换行文本值:
$scope.data = {text: 'Something'};
http://codepen.io/anon/pen/bHpiF 另一种解决这个问题的方法是在子作用域使用$parent
:
<mydirective>
<li><input type="text" ng-model="$parent.text"></input></li>
<li>{{$parent.text}}</li>
</mydirective>
http://codepen.io/anon/pen/stlcn 这取决于哪一个更好,但一般来说-我更喜欢第一个变体,避免在作用域内的原始值
实际上我自己找到了解决方案。有一种方法是使用transclude(scope,fn)
函数:
.directive('mydirective', function ($compile) {
return {
restrict: 'E',
transclude: true,
scope: false,
templateUrl: 'tmpl.html',
replace: false,
link : function(scope, element, attrs, ctrl, transclude){
transclude(scope,function(clone){
$compile(clone)(scope).appendTo(element.find("ul"));
});
}
};
});
查看此处更新的示例
相关文章:
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- 如何为通过ng-view指令或ng-controller指令创建的每个新作用域设置侦听器
- 为什么在创建作用域时将参数传递给anon函数
- JavaScript作用域:如何创建具有不同值的匿名函数
- 阻止控制器创建新的作用域对象
- 阻止“ng include”创建孤立的作用域.AngularJS
- AngularJS-由$scope创建的作用域何时执行$new()已删除.垃圾收集器或Angular负责处理它吗
- 如何创建作用域的动态、基于实例的对象文字
- 角度:创建可以调用作用域函数的自定义指令
- 作用域变量正在创建引用而不是新实例
- 作用域和将参数传递给动态创建的事件处理程序时出现问题
- 我应该如何创建一个作用域到另一个模型的主干集合
- 在AngularJS中创建子作用域的所有指令是什么
- IE是否为每个脚本标记创建新的作用域
- Javascript:从类内部创建全局作用域函数
- 从字符串创建的函数看不到父作用域
- '这'当创建函数存储在哈希中的JS对象时,其作用域为窗口对象
- ng如果在创建子作用域时打断网格
- 在AngularJS的1.3和2版中创建指令作用域的方式是一样的
- 访问Angular中通过隔离作用域创建的ng-model