如何从另一个范围变量内部设置$ scope变量

时间:2015-02-16 09:32:58

标签: angularjs

我有以下代码,我试图在一个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。实现的最佳做法同样的事情?

2 个答案:

答案 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