[問題] 請問如何將controller的區域變數變成全域變數

大家好,

我想請問一個關於AngularJS component的問題,

程式碼如圖所示:

我想請教的是,
$scope這個物件的作用域只在constructor函式裡而已,
我該如何將這個$scope指定給全域的變數呢?

此題目我也有在Stack Overflow上發問,大家也可以直接前往Stack Overflow上回覆,連結如下:

煩請大家不吝指教,感激不盡!!

以下寫法你參考一下
#寫法1

ctrler.$inject = ['$scope', '$cordovaDevice'];
class ctrler {
   constructor(private $scope, private $cordovaDevice){
      ....
   }


   methodA(){
     this.$scope.title = '';
   }
}

寫法2

但是通常寫到這邊,已經很少在使用 $scope 了,搭配 ControllerAs 就可以不用 $scope.

ctrler.$inject = '$cordovaDevice'];
class ctrler {
   title: string;
   constructor(private $cordovaDevice){
      ....
   }


   methodA(){
      this.title= '....';
   }
}

定義 Controller

controller: ctrler,
controllerAs: 'vm',

頁面的地方就會這樣子使用

{{ vm.title }}
1個讚

非常感謝您抽空回覆!!

我有按照你的方式去去嘗試看看了,可惜的是還是沒能成功,其中我有兩個問題:

  1. 我加入private之後,Editor有報錯,表示那是TypeScript的用法,所以不讓我加。
  2. 雖然我的確沒有加$inject,不過我是可以使用那兩個變數的,雖然只在constructor裡就是了XD

你可以在寫一個單獨的 method 測試你的 this.$scope 嗎?
我覺得是 this 在作怪,因為你的 onDeviceReady 是 addEventListener 的callback
所以在執行時, onDeviceReady內的 this 非 ctrler

1個讚

我懂你的意思了!

因為this所指向的物件不一樣,callback裡的this所指向的應該是document,但其實我要指向的應該要是Controller才對。

那這下子就麻煩了,我不想用匿名函式就是為了想再onDestory的時候可以remove掉這個listener,避免重複add ~"~

我試了一下,

我這樣子寫的話$scope本身的確是全域的沒錯,我在$onInit裡是可以將$scope印出來的,所以其實重點是在於eventListenercallback裡的this指標問題。

那我這樣子可能要將Listener移到run裡面,再用別的service去控制了。

總而言之,真的非常感謝您願意抽空回覆,感激不盡!!

如果是callback this 的問題到好解決

  document.addEventListener.('deviceready', this.onDeviceReady.bind(this))

利用 bind 將 controller(this) 傳進去就可以了

原來如此!!非常感謝你的回覆!!