为什么指令之间的作用域没有连接
Why scopes between directives not connecting?
我有下拉指令:dropdown.html:
<div class='dropdown-container' ng-class='{ show: listVisible }'>
<div class='dropdown-display insetShadow' ng-click='show();' ng-class='{ clicked: listVisible }'>
<span ng-if='!isPlaceholder'>{{ display }}</span>
<span class='placeholder' ng-if='isPlaceholder'>{{ placeholder }}</span>
<i class='fa fa-angle-down'></i>
</div>
<div class='dropdown-list'>
<div>
<div ng-repeat='item in list' ng-click='select(item)' ng-class='{ selected: isSelected(item) }'>
<div>
<span>{{property !== undefined ? item[property] : item}}</span>
<i class='fa fa-check'></i>
</div>
</div>
</div>
</div>
</div>
JS:
.directive('dropdown', ['$rootScope', function($rootScope) {
return {
restrict: "E",
templateUrl: "templates/dropdown.html",
scope: {
placeholder: "@",
list: "=",
selected: "=",
property: "@",
value: "@"
},
link: function(scope, elem, attr) {
scope.listVisible = false;
scope.isPlaceholder = true;
scope.select = function(item) {
scope.isPlaceholder = false;
scope.selected = item[scope.value];
scope.listVisible = false;
};
scope.isSelected = function(item) {
return item[scope.value] === scope.selected;
};
scope.show = function() {
scope.listVisible = true;
};
$rootScope.$on("documentClicked", function(inner, target) {
if(!$(target[0]).is(".dropdown-display.clicked") && !$(target[0]).parents(".dropdown-display.clicked").length > 0) {
scope.$apply(function() {
scope.listVisible = false;
});
}
});
scope.$watch('selected', function(value) {
if(scope.list != undefined) {
angular.forEach(scope.list, function(objItem) {
if(objItem[scope.value] == scope.selected) {
scope.isPlaceholder = objItem[scope.property] === undefined;
scope.display = (objItem[scope.property].toLowerCase().indexOf('пусто') == -1) ? objItem[scope.property] : '';
}
});
}
});
scope.$watch('list', function(value) {
angular.forEach(scope.list, function(objItem) {
if(objItem[scope.value] == scope.selected) {
scope.isPlaceholder = objItem[scope.property] === undefined;
scope.display = objItem[scope.property];
}
});
});
}
}
}])
用法:
<dropdown placeholder='' list='actions' selected='' property='title' value='id' style='width:150px;'></dropdown>
属性:list=>要在下拉列表中显示的对象数组,基本数据。selected=>要保存的范围中的变量的下拉值(选定对象字段中的值)。property=>数组中对象的字段,以便在下拉列表中像标签一样显示,供用户选择值。value=>对象的字段类似于选定的值。
示例:
$scope.savedValue;
$scope.dataList= [{
'title' :'text text text 111',
'id':'1'
}, {
'title' :'text text text 222',
'id':'2'
}, {
'title' :'text text text 333',
'id':'3'
}, {
'title' :'text text text 444',
'id':'4'
}, {
'title' :'text text text 555',
'id':'5'
}];
不工作(不知道为什么):
<dropdown placeholder='' list='dataList' selected='savedValue' property='title' value='id'></dropdown>
工作:
$scope.obj = {};
$scope.obj.savedValue;
<dropdown placeholder='' list='dataList' selected='obj.savedValue' property='title' value='id'></dropdown>
常见点问题。不能修改嵌套范围中的简单字符串。在你的plunk中,让我们做一些修改,添加第二个下拉列表:
<dropdown ng-repeat="i in [1, 2]" style='width:150px;' placeholder='' list='dataList' selected='savedValue' property='title' value='id'></dropdown>
selected: {{ savedValue }}
人们预计也会看到两个相互关联的下降——但这并没有发生。Ng-reeat为每个元素创建嵌套作用域,savedValue成功传递给子作用域,但子作用域不能修改它。http://plnkr.co/edit/Nd0wDm6chq6CKDlucRfZ?p=preview
所以你需要使用一些包装:
<dropdown ng-repeat="i in [1, 2]" style='width:150px;' placeholder='' list='dataList' selected='o.savedValue' property='title' value='id'></dropdown>
selected: {{ o.savedValue }}
然后它就起作用了:http://plnkr.co/edit/HMWBTrW9egFc663uniiO?p=preview
相关文章:
- 监视函数从服务返回不起作用,但作用域函数起作用
- 将作用域存储在JSON中
- 从控制器继承了隔离的作用域以生成可重用的指令
- 从ng模板访问作用域
- 调用私有作用域
- 对父作用域的指令更新延迟了一步
- 正在$rootScope上达到控制器作用域$在内部控制器上
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- 这两个关于 JavaScript 作用域链的例子有什么区别?
- 在具有命名作用域的自定义Polymer元素中隐藏表行
- AngularJS指令隔离作用域
- Angularjs:修改js中的作用域,稍后在页面中使用
- 访问多个指令的隔离作用域
- Javascript作用域和Ajax调用;工作不正常
- 向Angular作用域对象添加对象数组——TypeError
- ng重复中的ng模型-初始化唯一作用域属性
- Angularjs 连接两个作用域数组
- 为什么指令之间的作用域没有连接
- 连接字符串以形成作用域属性
- 如何在angularjs中连接变量名和作用域