簡體   English   中英

如何從另一個作用域變量內部設置$ scope變量

[英]How to set a $scope variable from inside another scope variable

我有以下代碼,並且我試圖在諾言(在本例中為$http請求)完成后設置$scope變量的值。 代碼如下:

.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 ,當我在模板中查找該項目( NewItemCtrl是其控制器)時,也沒有任何記錄。 好像我從來沒有發送過,即使它顯然具有價值。

有人可以向我解釋如何或者A.從另一個作用域內部設置$scope屬性的值,或者B.實現同一目標的最佳實踐?

發生這種情況是因為您要進入另一個狀態,該狀態會重新創建范圍對象。

實現此目的的一種方法是使用分層狀態。 子作用域可以訪問其父狀態的作用域。 由於您要進入'tab.newitem-label',因此如果在進入此新狀態之前處於'tab'狀態,則在tab狀態下設置label就足以從tab.newitem訪問它。

我相信您正在使用ui-router 然后,您可以使此標簽成為現有狀態的一部分。 可以通過$stateParams訪問參數化的值。 因此, $state.go('tab.newitem-label');轉移到$state.go('tab.newitem-label'); ,則可以使用以下語法將參數傳遞到新狀態: $state.go('tab.newitem-label', {labelId: labelId}); 然后,您可以在控制器中使用$stateParams.labelId訪問labelId參數,並且在創建控制器之前,可以通過狀態resolve功能使用labelId檢索標簽。 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);
          }]
        }
      })

您可以將手表放在{$ scope.label}上,看看新值更新是否觸發了手表功能的執行。一旦確認更新觸發了手表,請使用該功能更新所有場所/控制器,其中{ $ scope.label}可能已通過$ emit / $ broadcast使用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM