2016-04-10 16 views
0

私はAngularJSを学び、scopedirectivesおよびdomについての概念で明確にするためにいくつかの奇妙な実験を行っています。AngularJS - HTML要素のスコープを新しいスコープに変更する

AIM:私の問題があるrootCtrl

eggly.controller('rootCtrl',function($scope,$timeout,$compile){ 

    $scope.box = "lunchbox"; --> first assign box = lunchbox 
    $timeout(function(){ 

     //delete $scope; 
     var newScope = $scope.$new(); --> create a new scope 
     newScope.box = "dinnerbox"; ---> Assign new value 
     $compile($('#grocery'))(newScope); --> compile div with new scope 
     //newScope.$apply(); --> I think $timeout already do $apply so commented out 

    },1000); 

}); 

新しく作成された子スコープ」

index.htmlを

<html ng-app="eggly" ng-controller="rootCtrl"> 
    <body> 
    <div id="grocery"> 
     {{box}} 
    </div> 

    </body> 
</html> 

にHTML要素<div id="grocery">のスコープの変更:

  1. 私は$timeout機能でnew scope$compileを作成した場合、私はnew scope$timeout機能ではないではない$compileを作成しない場合、私は
  2. を期待していて、その後、私のビューがdinnerboxで更新され、その後私の見解は、古い値、すなわち私を示していlunchboxしかし、クロムコンソールショー私にangular.element($0).scope().box私のdinnerbox($タイムアウト実行後)の範囲を示しています。

私は間違っていますか?

+0

いずれも最初の場所でのコントローラに属していません。また、 '$ compile'をjQueryオブジェクトに使用しません。あなたがしようとしているのは、貧しい人の指示を作り、これに対して実際の角度の指示を使うべきです。 – charlietfl

+0

@charlietfl:あなたがコメントしたことは別として、私はあなたから期待していることのみ、なぜそれが動作していないのか知っていますか?ありがとう – voila

+0

@charlietfl:$コンパイルでは、jqueryオブジェクトのangular.elementを使用することができます。AFAIK – voila

答えて

0

$compileが呼び出されているとき、#groceryの内容は、lunchboxであり、{{ box }}ではありません。現時点では、ng-controllerディレクティブは既にリンクされており、バインディング情報はプレーンなHTMLとして利用できません。

この欠点は、結合{{ }}にディレクティブの代替を使用することによって克服することができます。これの

<div id="grocery"><span ng-bind="box"></span></div> 
+0

これは、「角度付きjQueryを使用しないでください」という文で言及される数多くの要素の1つです。問題はjQueryではなくAngularの推奨ワークフローを壊すのに必要な熟練のレベルですが、スムーズに動作します。このレベルでは、開発者は、使い慣れたjQueryユースケースの98%がAngularの反パターンであることを通常認識しています。 – estus

関連する問題