2014-06-11 102 views
0

的jsfiddle:http://jsfiddle.net/3gd8a/1/角適用範圍變更

(function() { 
    var app = angular.module("index", []); 

    app.run(function ($log, $controller) { 
     $log_service = $log; 
     $controller_service = $controller; 
    }); 

    app.controller("AlertsController", function() { 
     this.alerts = [ "first alert" ]; 
     this.innerFunction = function() { 
      this.alerts.push("inner alert"); 
      $log_service.debug(alerts.alerts); 
     }; 
    }); 
})(); 

function outerFunction() { 
    var alerts = $controller_service("AlertsController"); 
    alerts.alerts.push("outer alert"); 
    $log_service.debug(alerts.alerts); 
}; 

在這個例子中,我在外部JS功能改變控制器實例的屬性,

現在我也不已知我怎麼可以像使用$ scope.apply()一樣來應用它。

我已經閱讀角提示手錶如何最適用,運行-A-消化,

$範圍有$應用功能,但控制器實例沒有之一。

您可能想問爲什麼我使用控制器實例不是$ scope,因爲我學習的角度js來自codeschool,所以我想用我學會的同樣的方法,如果可能的話。

你可能想問爲什麼不使用ng-click,我知道使用ng-click會工作,但我想知道角度js如何監視控制器實例的屬性以及如何手動應用它們的更改。

編輯:

我想通了控制器實例是剛剛任命alerts在$範圍,當我通過ng-controller="AlertsController as alerts"使用它的屬性。

現在我有另一個問題,如果我從outerFunction訪問$範圍將導致一個錯誤。

第一次是Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope http://errors.angularjs.org/1.2.1/$injector/unpr?p0=%24scopeProvider%20%3C-%20%24scope angular.js:78

而第二次是 Error: [$injector:cdep] Circular dependency found: http://errors.angularjs.org/1.2.1/$injector/cdep?p0=

+0

編輯後的版本:http:// jsfiddle。net/3gd8a/5/ – user3085220

+0

最後版本http://jsfiddle.net/3gd8a/6/,我應該通過控制器下的元素來獲取範圍。 – user3085220

回答

0

既然沒有人回答,我離開我的答案在這裏。

控制器實例是在$範圍對象後initiazlied,在例子中,我別名AlertsControlleralerts所以在$範圍命名爲alerts

Then $scope.alerts and this is equivalent。

在第一條評論(http://jsfiddle.net/3gd8a/5)我試圖把$範圍全球然後從outerFunction訪問它,但失敗了,我仍然需要找出原因。

在第二個評論(http://jsfiddle.net/3gd8a/6)中,我發現$ scope可以從控制器內部的元素中獲得,並且它可以正常訪問。

所以隨時更新和全局函數應用控制器實例的屬性的方法是

  1. ID添加到任何元素內部控制
  2. 使用angular.element發現,元素,然後調用.scope()得到的範圍。
  3. 使用scope.{alias of controller}.{property name}更新屬性,然後致電$scope.apply申請。