更新范围时,指令的属性不会更改,它们仍保留初始值.我在这里错过了什么?
HTML
<ul class="nav nav-pills nav-stacked" navlist>
<navelem href="#!/notworking/{{foo}}"></navelem>
<navelem href="#!/working">works great</navelem>
</ul>
<p>works: {{foo}}</p>
Run Code Online (Sandbox Code Playgroud)
Javascript (基于首页上的角度标签示例)
angular.module('myApp.directives', []).
directive('navlist', function() {
return {
scope: {},
controller: function ($scope) {
var panes = $scope.panes = [];
this.select = function(pane) {
angular.forEach(panes, function(pane) {
pane.selected = false;
});
pane.selected = true;
}
this.addPane = function(pane) {
if (panes.length == 0)
this.select(pane);
panes.push(pane);
}
}
}
}).
directive('navelem', function() {
return {
require: '^navlist',
restrict: 'E',
replace: true,
transclude: true,
scope: { href: '@href' },
link: function(scope, element, attrs, tabsCtrl) {
tabsCtrl.addPane(scope);
scope.select = tabsCtrl.select;
},
template:
'<li ng-class="{active: selected}" ng-click="select(this)"><a href="{{href}}" ng-transclude></a></li>'
};
});
Run Code Online (Sandbox Code Playgroud)
通过scope: {}在您的指令中定义,它正在创建一个isolated scope.因此,父范围现在在指令中是不可见的.
如果要引用父作用域,则可以放置scope: true共享作用域(在相同的指令中),并省略正常作用域嵌套的作用域声明.或者,如果您只想引用$scope.foo父级,则可以像在child子指令中一样定义显式范围变量.
指令范围继承有三种类型:
scope: false- 没有创建新的范围.该指令使用与父级相同的范围.这很简单方便,但是如果要构建可重用的组件,则不建议这样做,因为如果父作用域具有指定的指令需要使用/访问的某些作用域属性,则该指令可能仅可用.scope: true - 创建一个新范围,由同一元素上的所有指令共享,具有父范围的正常原型继承.同样,可能不是可重用组件的最佳选择,因为该指令可能不应该访问父范围属性 - 它可能会意外地更改父级中的某些内容.scope: { ... } - 创建一个新的"隔离"范围 - 它不是原型继承父范围.但是,对象哈希(即{...})允许我们定义从父作用域派生的本地指令作用域属性 - 因此我们可以控制共享哪些属性以及如何共享.
对于您的特定问题,您需要在对象哈希中指明您希望具有双向绑定的范围属性.
有关指令范围(包括图片)的更多信息,请参阅此处的指令部分:AngularJS中范围原型/原型继承的细微差别是什么?
| 归档时间: |
|
| 查看次数: |
4036 次 |
| 最近记录: |