2016-10-31 5 views
1

私は$watchの機能を持っています。国が選択されたときに時計を表示しますが、変更されたデータをスコープに保存していません。私は1つのUIビューを持っていましたが、うまくいきましたが、構造を変更して同じページの下に2つのUIビューを表示しました。変更の理由は、きれいなHTMLページを持っていたからです。私は常に1つのUIビューに戻ることができましたが、それは面倒です。これが問題を起こした場所です。ここ

がapp.js

$stateProvider 
.state('homepage',{ 
    templateUrl: '/static/partial/home/homeLayout.html', 
    controller: 'UploadFileCtrl', 

}) 
.state('homepage.show',{ 
    url: '/', 

    views: { 
    querySetup: { 
     templateUrl: '/static/partial/home/querySetup.html', 

    }, 
    queryResults: { 
     templateUrl: '/static/partial/home/queryResults.html', 

    }, 
    } 
}) 

layout.htmlある - UI-ビュー:

<div class="col-sm-12 panel-container"> 


    <div class="col-sm-6" style="height: 100%;"> 
    <div ui-view="querySetup" ></div> 
    </div> 

    <div class="col-sm-6" style="height: 100%;"> 
    <div ui-view="queryResults"></div> 
    </div> 

</div> 

コントローラの腕時計:

$scope.currentCountries = [ 
{ 
    name: 'United States', 
    code: 'US' 
}, 
{ 
    name: 'United Kingdom', 
    code: 'GB' 
}, 
{ 
    name: 'Germany', 
    code: 'DE' 
}, 
{ 
    name: 'France', 
    code: 'FR' 
}, 
{ 
    name: 'China', 
    code: 'CN' 
}, 
{ 
    name: 'Japan', 
    code: 'JP' 
} 
]; 

$scope.$watch('pickedCountry', function(){ 

if($scope.pickedCountry != null){ 
    $scope.countryCode = $scope.pickedCountry.code; 
} 

}); 

ここではquerySetup図である:

<select name="brand" ng-model = "pickedCountry" 
     data-ng-options="country as country.name for country in currentCountries"> 
     <option value="">Select Brand</option> 
     </select> 

コントローラをstate homepageの外に移動し、state homepage.showの下の各ビューに設定しました。これは正常に機能しましたが、余分な操作は機能しません。ブランドを選択するときは、計算を実行してqueryResultsビューに設定する必要があります。結果はスコープに設定され、queryResultsに表示する必要があります。ここ

はqueryResultsです:

<div class="panel panel-info"> 
    <div class="panel-heading"> 
    <h3 class="panel-title">OSM RESULTS</h3> 
</div> 
<div class="panel-body"> 
<textarea rows="50" cols="100" class="xmlOutput"> 
    {{ queryResults }} 
</textarea> 
</div> 
</div> 

助けてください! Angular $ watchに慣れていないと、2つのUIビューがあるときに問題が発生すると思います。あなたの助けを前にありがとう。

UPDATE

は私の問題への解決策を見つけたので、私は私のモデルに$parentを追加して、私の$watch関数へのparamとして変更されたデータを渡す必要があります。

のhtml更新:

<select name="brand" ng-model = "$parent.pickedCountry" 
     data-ng-options="country as country.name for country in currentCountries"> 
     <option value="">Select Brand</option> 
     </select> 

コントローラ更新

$scope.$watch('pickedCountry', function(data){ 

if(data != null){ 
    $scope.countryCode = data.code; 
} 

}); 

これで問題は解決しましたが、どうして私が親を追加する必要があるのか​​は分かりません。なぜ誰かが説明できますか?

答えて

1

あなたのコントローラはホームページに掲載されるように設定されていますが、あなたのテンプレートはhomepage.showのホームページの子の状態です。そのコントローラから変数にアクセスするには、親状態のスコープにアクセスするために$ parent(あなたが発見したように)を使用できます。

あなたの国の定義を再構築することをお勧めします。だから、それに対処する必要はありません。

.state('homepage', { 
    url: '/homepage', 
    views: { 
     '':{ 
      templateUrl:'/static/partial/home/homeLayout.html', 
      controller: 'UploadFileCtrl', 
      }, 
     '[email protected]': { 
       templateUrl:'/static/partial/home/querySetup.html' 
      }, 
     '[email protected]':{ 
       templateUrl:'/static/partial/home/queryResults.html' 
      } 
     } 
    }) 
+0

私は構造をお勧めしなかった、と '$のparent'を取り出し、そして' $時計は動作していません。 '$ parent'を離れる必要があるのですか、' '$ watch''を使って別のことをする必要がありますか? URLは '/ homepage'には設定されていませんでしたが、'/'にする必要があります。それとも '/ homepage 'でなければならないのですか? – medev21

+0

それは私がそれが思ったように動作しません。各ui-viewは、兄弟スコープの変数にアクセスできない子スコープを作成します。それはコミュニケーションの面で2つの選択肢を残します。 1. $ scope。$ broadcast/$ scope。$ onを使用してイベントをブロードキャストし、それを聞くことができます。2.通信にサービスを使用できます。3. $ parentを使用できます。 $ parentを使用することに決めた場合、ng-modelがすでに暗黙的に時計を追加しているので、時計を作成しないことをお勧めします。代わりにng-model = $ parent.pickedCountryを設定し、結果に{{pickedCountry}}と表示します –

0

私は子供の状態がディレクティブのプロトタイプ継承(scope: true)と同じように動作するので、それがあると信じています。

$scope.input = {}; 
$scope.$watch('input.pickedCountry', function(data){ 
    if(data != null){ 
     $scope.countryCode = data.code; 
    } 
}); 

とquerySetupテンプレートで:

あなたのコントローラで定義考えるかもしれません

<select name="brand" ng-model = "input.pickedCountry" 
    data-ng-options="country as country.name for country in currentCountries"> 
    <option value="">Select Brand</option> 
</select> 
関連する問題