如果是子对象,则使用Angular设置ng的父对象高度
Using Angular to set parent height of ng-if children
我觉得我在这里做错了很多事情。我有一个有3个状态的视图-称它们为介绍、加载和完成。我希望随着用户的进步,每个状态都能从左向右滑动。
以下是基本结构:
var app = angular.module('plunker', ['ngAnimate']);
app.controller('MainCtrl', function($scope) {
$scope.triggered = '';
$scope.loading = false;
$scope.completed = false;
$scope.one = function() {
console.log('one');
$scope.loading = true;
$scope.completed = false;
};
$scope.two = function() {
$scope.loading = false;
$scope.completed = true;
};
}).directive('inheritHeight', ['$window', '$timeout', function($window, $timeout) {
return {
restrict: 'A',
link: function (scope, elm, attrs) {
scope.$watch("loading", function(newV, oldV) {
console.log(newV, elm[0]);
$timeout(function () {
scope.triggered = scope.triggered + 'triggered ';
scope.height = elm[0].querySelector('.child').offsetHeight;
console.log(elm[0].querySelector('.child'));
console.log(elm[0].querySelector('.child').offsetHeight);
elm.css('height', elm[0].querySelector('.child').offsetHeight + 'px');
});
});
}
};
}]);
.parent {
border: 1px solid red;
position: relative;
overflow: hidden;
}
.child {
width: 100%;
position: absolute;
top: 0;
left: 0; }
.child.ng-enter, .child.ng-leave {
-webkit-transition: 800ms cubic-bezier(0.645, 0.045, 0.355, 1) all;
-moz-transition: 800ms cubic-bezier(0.645, 0.045, 0.355, 1) all;
-ms-transition: 800ms cubic-bezier(0.645, 0.045, 0.355, 1) all;
-o-transition: 800ms cubic-bezier(0.645, 0.045, 0.355, 1) all;
transition: 800ms cubic-bezier(0.645, 0.045, 0.355, 1) all; }
.child.ng-enter {
-webkit-transform: translateX(100%);
-moz-transform: translateX(100%);
-ms-transform: translateX(100%);
-o-transform: translateX(100%);
transform: translateX(100%); }
.child.ng-enter.ng-enter-active {
-webkit-transform: translateX(0);
-moz-transform: translateX(0);
-ms-transform: translateX(0);
-o-transform: translateX(0);
transform: translateX(0); }
.child.ng-leave {
-webkit-transform: translateX(0);
-moz-transform: translateX(0);
-ms-transform: translateX(0);
-o-transform: translateX(0);
transform: translateX(0); }
.child.ng-leave.ng-leave-active {
-webkit-transform: translateX(-100%);
-moz-transform: translateX(-100%);
-ms-transform: translateX(-100%);
-o-transform: translateX(-100%);
transform: translateX(-100%); }
.child-a {
background-color: green;
height: 100px;
}
.child-b {
background-color: blue;
height: 50px;
}
.child-c {
background-color: yellow;
height: 30px;
}
<script src="https://code.angularjs.org/1.4.9/angular.js" data-semver="1.4.9"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.2/angular-animate.js"></script>
<div ng-app="plunker" ng-controller="MainCtrl">
<div class="parent" inherit-height="">
<div class="child child-a" ng-if="!loading && !completed">
<button ng-click="one()">Click One</button>
</div>
<div class="child child-b" ng-if="loading && !completed">
<button ng-click="two()">Click Two</button>
</div>
<div class="child child-c" ng-if="!loading && completed"></div>
</div>
<p>{{ height }}</p>
<p>{{ triggered }}</p>
</div>
当新状态出现时,带有inherit-height
指令的父div似乎无法正确更新其高度,即使它在scope.$watch
和$timeout
中。。。
有什么建议吗?谢谢
所以我希望querySelector能工作,因为ng-if从DOM中删除元素,但事实并非如此。瞄准要转换的子元素就成功了:
elm.css('height', elm[0].querySelector('.child.ng-enter').offsetHeight + 'px');
在制作任何关于动画和css的东西之前,有两件事你需要提前知道:
1.指令的范围与控制器中的范围不同
在您的示例中,status.loading
不指向任何内容。由于您没有为inherit-height
指令分配一个独立的作用域,因此它的作用域将与其父级(在您的情况下为MainCtrl
)相同。然而,您从来没有注册过类似$scope.status.loading
的东西,所以观察者是在免费监视,这就是为什么$timeout
服务中的所有逻辑都不起作用的原因。
2.指令的链接函数中的元素参数是元素本身,而不是数组
所以做elm[0]
没有任何意义。同样的目标也可以通过elm.eq(0).height()
来实现。
3.querySelector
将只返回匹配的第一个元素
因此,在您的情况下,它将始终选择child-a
,可能不是您想要的。以这种方式获取子元素的高度通常也是一种不好的做法。如果确实需要,创建另一个指令并要求父级提供它会更好。
我建议你在制作其他复杂的css部分之前,先查看angular文档或其他教程中的指令范围和链接函数的想法。
相关文章:
- 如何在ng-click中传递php对象
- 如何使用ng repeat中的选定输入更新我的对象
- 无法使用ng repeat检索动态创建的JSON对象的属性
- Angular.js通过对象关键点上的ng选项进行跟踪
- 想要将ng个repeat对象传递给自定义筛选函数
- 在禁用ng的情况下搜索JSON对象(AngularJS)
- Angularjs:ng重复对象数组
- 使用ng-src增强对象内部的数组
- AngularJS:根据其他对象预先选择ng repeat中的select元素
- 如果是子对象,则使用Angular设置ng的父对象高度
- 有角度的ng点击ng的内部重复总是得到相同的对象
- 角度控制器不绑定服务对象属性 ng-repeat
- 如何将 JSON 对象映射到 ng-repeat 中的折叠行
- 对象不能在angularjs ng-model中访问
- 在angularjs ng-repeat指令中对对象进行排序
- 将新对象“附加”到 ng 重复项
- 对象内部数组中的角度 ng 重复键
- ng-repeat不绑定ng-model对象数组
- 使用 ng-repeat解析不均匀数据/ json对象
- Javascript-如何访问Angular js表达式中的数组对象?(ng重复)