【发布时间】:2015-02-03 05:58:17
【问题描述】:
当我的 AngularJS “页面”加载时,我从服务器获取一些数据并将其设置为范围:
myApp.controller('somePage', ['$scope', 'User', '$routeParams', function($scope, User, $routeParams){
// Get the user.
User.get('1234').then(function(user){
$scope.user = user;
});
});
在我的页面上,我有一个需要定义 $scope.user 的指令。
<div>
<user-profile-info></user-profile-info>
</div>
指令:
myApp.directive('addActionButton', function() {
return {
scope: false,
link: function(scope, element, attrs){
element.bind('click', function(){
alert(scope.user.name);
});
},
template: '<button id="foo">Say hi to {{ user.name }}</button>'
};
})
现在页面在$scope.user定义之前渲染组件,所以有错误。
如何使该指令仅在 $scope.user 存在时呈现? 或者如何使我的页面视图仅在控制器完成获取其数据后呈现?
编辑:以上所有代码都已大大简化,因此您不必阅读额外信息 - 但仍然具有组件所需的约束(例如链接、带有属性的模板、带有 ajax 调用的范围)。
【问题讨论】:
-
在 scope.user 上添加 watch 并查看 newvalue
-
但是如果获取scope.user值需要5秒,那么组件在准备好之前仍然会被破坏。
-
使用 ng-show 来隐藏无效值
-
@DonnyP 你能展示你的指令代码吗? @Ulterior,即使有一个包装
ng-show元素,Angular 仍然会编译和链接指令;所以如果指令之前抛出异常,它仍然会抛出异常。但这是正确的想法,带有条件user !== undefined的ng-if应该可以解决问题,因为ng-if将明确停止编译任何嵌套指令.. -
我认为您更担心的是处理而不是渲染。您可以设置 2 路绑定并附加承诺,或者您可以使用事件来让指令知道开始,或者您可以在初始化指令过程之前对数据设置一次性监视。你的指令看起来如何?
标签: angularjs angularjs-directive angularjs-scope