我有以下代码,我试图在一个promise(在这种情况下是$scope
请求)完成后设置$http
变量的值。代码如下所示:
.controller('NewItemCtrl', function ($scope, $state, LabelFactory) {
$scope.createItem = function (item) {
LabelFactory.createLabel(item)
.then(function (response) {
$scope.label = response.data;
$scope.thing = 'These are things';
$state.go('tab.newitem-label');
console.log($scope.label);
});
};
})
它看起来应该可以工作,但事实并非如此。即使我能够正确记录$scope.label
,当我在模板中查找该项目时({1}}是控制器),没有任何内容。就好像我从来没有发过它,即使它显然有价值。
有人可以向我解释如何 A。从另一个范围内设置NewItemCtrl
属性的值,或 B。实现的最佳做法同样的事情?
答案 0 :(得分:1)
这种情况正在发生,因为您将转到另一个重新创建范围对象的状态。
实现此目的的一种方法是使用分层状态。子范围可以访问其父状态的范围。因为你要去tab.newitem-label',如果你在州的标签'在转到此新状态之前,在label
州范围内设置tab
就足以从tab.newitem
访问它。
我相信你正在使用ui-router
。然后,您可以将此标签作为现有状态的一部分。可以通过$stateParams
访问参数化值。因此,您可以使用以下语法将参数传递给新状态,而不是移至$state.go('tab.newitem-label');
:$state.go('tab.newitem-label', {labelId: labelId});
然后,您可以在控制器中使用labelId
访问$stateParams.labelId
参数创建控制器后,您可以使用labelId
状态的resolve
功能检索标签。 Resolve
功能可帮助您在实例化控制器之前检索日期。然后,您可以将已解析的数据注入控制器,类似于向控制器注入服务。
这就是你定义这种状态的方法:
.state('tab.newitem-label', {
url: '/:labelId',
templateUrl: 'partials/yourpage.html',
controller: 'NewStateCtrl'
resolve: {
label: ['labelService', '$stateParams', function (labelService, $stateParams) {
return labelService.retrieveLabelFromLabelId($stateParams.labelId);
}]
}
})
答案 1 :(得分:0)
你可以把手表放在{$ scope.label}上,看看新值更新是否触发watch函数执行。你确认更新是否触发了手表,使用该函数来更新所有位置/使用{$ scope.label}的控制器可能使用$ emit / $ broadcast