2017-03-29 4 views
0

私は以下のコードを持っていますが、ここではfoo(val)関数を外部のどこからでも呼び出すと仮定しましょう。AngularJs:コールコントローラー機能が外部から 'this'にバインドされました(ブラウザコンソールなど)

angular.module('app', []); 
angular.module('app') 
    .controller('MyController', MyController); 

function MyController() { 
    var self = this; 
    self.foo = function(val) { 
     console.log(val); 
    }; 
    return self; 
} 

以下のコードは、foo()が$ scopeにバインドされている場合にのみ機能します。

angular.element(document.getElementById('MyController')).scope().foo('Hello'); 

周りのすべての作業はありますか私はこのために$scopeを使用するように強制されますか?

angular.module('app', []); 
angular.module('app') 
    .controller('MyController', MyController); 

function MyController() { 
    var self = this; 
    self.foo = function(val) { 
     console.log(val); 
    }; 
    window.callFoo = function(val) { 
     self.foo(val);  
    } 
    return self; 
} 

今、私はどこからこのwindow.callFoo()関数を呼び出すことができる午前:周りの仕事を見つけ

+0

なぜこれをやりたかったですか?サービスを作成してその中に関数を入れ、他のコントローラ/サービスから呼び出すこともできます – AlainIb

+0

http://stackoverflow.com/questions/13743058/how-do-i-access-the-scope-variable-in-browsers- console-using-angularjs?rq = 1 – AlainIb

+0

(少なくともグローバル変数はありません) – Derlin

答えて

1

コントローラは「controllerAs」構文でインスタンス化されると、thisコンテキストが指定された名前とスコープのプロパティにバインドされます。コンソールから実行上記のコマンドを実行します

<div id="MyController" ng-controller="MyController as vm"> 
    <button ng-click="vm.foo()"> 
     Click foo 
    </button> 
</div> 
$scope = angular.element(document.getElementById('MyController')).scope() 

$scope.vm.foo('Hello'); 
$scope.$apply(); 

をクリックしたのと同じ動作fooボタンをクリックします。

+0

それは働いて、ありがとう:) –

0

。私たちがJavaScriptでクロージャーを扱うようになったように思えます。 まだ誰かがより良いアプローチを見つけた場合。ここに投稿してください。

+0

これが角2かどうかわかりませんが、角1ではこれは簡単にバグを引き起こす可能性があります。ダイジェストサイクルが実行されておらず、エクスポーズされたメソッドを実行した場合、手動でダイジェストサイクルを実行しない限り、データバインディングは発生しません。 (それは角度の知っていることから起こった)。手動でダイジェストを実行している場合は、すでに実行中の場合は例外がスローされます。 – ste2425

関連する問題