1

アンヌーブはこちら。routeProvider を使用してビュー内の外部 html ページを交換するグローバル ナビゲーションがあります。ビュー内で、外部 html ファイルの div を切り替えるリスト タイプのサブ ナビゲーション (ng-repeat で作成) を設定します。appCtrl で手動で設定すると、ページを読み込むことができます。

//Here I set the initial value
    $scope.page = 'Comfort Homes of Athens';

しかし、ng-click があるスパンをクリックすると。私は何も得ません。スコープの問題だと思い始めましたが、 ng-click='alert()' だけを入れても何もしません。

私は他の投稿を読んだことがありますが、ほとんどの場合、逆ではなく ng-switch の中に ng-click を入れているようです。また、例でもルーティングを使用していません。angularはまだ新しいので、まだ出会っていないものかもしれません。

アプリの HTML:

<body ng-app="app">
<header ng-include="header.url" ng-controller="nav"></header>
<article ng-view></article>
<footer ng-include="footer.url" ng-controller="nav"></footer>
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.16/angular.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.16/angular-route.js"></script>
    <script type="text/javascript" src="js/data.js"></script>
    <script type="text/javascript" src="js/model.js"></script>
</body>

外部 HTML ファイル:

<div id="web" class="wrapper">
    <aside class="boxModel">
        <div id="controller" class="container">
            <div class="topBox bluebg subNavBar"><h1 class="white">Projects</h1></div>
            <div ng-controller="nav" id="controls" class="botBox whitebg">
                <span ng-repeat='item in webProjects' ng-click="page='{{item.name}}'">{{item.name}}</span>
            </div>
        </div>
    </aside><section ng-switch on="page" class="boxModel">

        <div ng-switch-when="Comfort Homes of Athens" id="sandbox" class="container round box whitebg">
           <h1>Here is link 1</h1>
        </div>

        <div ng-switch-when="Sealpak Incorporated" id="sandbox" class="container round box whitebg">
            <h1>here is Link 2</h1>
        </div>
    </section>
</div>

JS:

var app = angular.module("app", ["ngRoute"]);

function nav($scope) {
    $scope.templates = templates;
    $scope.header = $scope.templates[0];
    $scope.footer = $scope.templates[1];
    $scope.mainNav = mainNav;
    $scope.footNav = footNav;
}
app.config(function($routeProvider) {
    $routeProvider.when('/',{
        templateUrl: "templates/home.html",
        controller: "AppCtrl"
    }).when('/templates/web.html',{
        templateUrl: "templates/web.html",
        controller: "AppCtrl"
    }).when('/templates/seo.html',{
        templateUrl: "templates/seo.html",
        controller: "AppCtrl"
    }).otherwise({
        template: "This doesn't exist!"
    });
});

app.controller("AppCtrl", function($scope) {
    $scope.webProjects = webProjects;
    $scope.seoProjects = seoProjects;
//Here I set the initial value
    $scope.page = 'Comfort Homes of Athens';
});
4

3 に答える 3

4

あなたにとって残念なことに、ng-repeatお互いに兄弟であり、親コントローラーの子である子スコープを作成します ( ng-controller="nav") が、あなたの<section>場所ng-switchは あなたの子スコープではありませんng-controller="nav"が、AppCtrl.

ng-click="$parent.$parent.page=item.name"角度でスコープを理解しようとすることができます。

<div id="web" class="wrapper">
<aside class="boxModel">
    <div id="controller" class="container">
        <div class="topBox bluebg subNavBar"><h1 class="white">Projects</h1></div>
        <div ng-controller="nav" id="controls" class="botBox whitebg">
            <span ng-repeat='item in webProjects' ng-click="$parent.$parent.page=item.name">{{item.name}}</span>
        </div>
    </div>
</aside><section ng-switch on="page" class="boxModel">

    <div ng-switch-when="Comfort Homes of Athens" id="sandbox" class="container round box whitebg">
       <h1>Here is link 1</h1>
    </div>

    <div ng-switch-when="Sealpak Incorporated" id="sandbox" class="container round box whitebg">
        <h1>here is Link 2</h1>
    </div>
</section>

このソリューションは非常に醜いため、使用することはお勧めしません。@ link64 の解決策の方が優れていますが、の継承modelは非常に暗黙的であり、密結合のコードを作成すると思います。ここで、イベントを発行することでより良い解決策を提案します。

<span ng-repeat='item in webProjects' ng-click="$emit('pageChange',item.name)">{{item.name}}</span>

$emit('pageChange',item.name)angular がテンプレートの式を解決できるかどうかはわかりません。問題が発生した場合は、コントローラー内に次のように記述できます。

<span ng-repeat='item in webProjects' ng-click="setPageChange(item.name)">{{item.name}}</span>

navコントローラーで:

$scope.setPageChange = function (pageName) {
         $scope.$emit("pageChange",pageName);
   }

で、AppCtrlイベントを聞いてページを更新します。

app.controller("AppCtrl", function($scope) {
    $scope.webProjects = webProjects;
    $scope.seoProjects = seoProjects;
//Here I set the initial value
    $scope.page = 'Comfort Homes of Athens';

    $scope.$on("pageChange", function (event, newPage){
         $scope.page = newPage;
    }
});
于 2014-09-19T23:59:48.330 に答える
1

@KhanhTo の回答に加えて、ngRoute の代わりに使用する別のツールを紹介したいと思います。UIルーター。これは元の質問に対する答えではありませんが、問題を完全に回避するより良い解決策です。

UI-Routerは ngRoute のページ ルーティングを強化し、状態をより中心にしています。テンプレートとオプションのコントローラーを持つ状態に移行します。$stateChangeStartまたはなどの独自のイベントを発行します$stateChangeSuccess。これらの状態遷移は、関数command $state.go(stateName)またはディレクティブui-sref="my.state({name: item.name})

UI-Router は非常に強力なツールであり、ここですべての詳細を説明することはできませんが、ドキュメントとコミュニティは素晴らしいものです。

コードを簡単に書き直すと、次のようになります。

web.html のテンプレート

<div class="wrapper">
    <aside class="boxModel">
        <div id="controller" class="container">
            <div class="topBox bluebg subNavBar"><h1 class="white">Projects</h1></div>
            <div ng-controller="nav" id="controls" class="botBox whitebg">
                <span ng-repeat='item in webProjects' ui-sref="app.web.page({name: {{item.name}})">
                    {{item.name}}
                 </span>
            </div>
        </div>
    </aside> 
    <section class="boxModel">

        <div ui-view class="container round box whitebg">
           <!-- Page content will go here -->
        </div>
    </section>
</div>

JavaScript

app.config(function($stateProvider) {
     $stateProvider
          .state('app', {
            abstract: true,
            template: '<div ui-view></div>', //Basic template 
            controller: "AppCtrl",
        }).state('app.home', {
            templateUrl: "templates/home.html",
            url: '/home'
        }).state('app.web',{
            templateUrl: "templates/web.html",
            url: '/web'
        }).state('app.web.page',{
            templateUrl: "templates/page.web.html",
            url: '/web/page/:name' //Note here the ':' means name will be a parameter in the url
        }).state('app.seo',{
            templateUrl: "templates/seo.html",
            url: '/seo'
        });
    });

app.controller('AppCtrl', function($scope){
    $scope.webProjects = webProjects;
    $scope.seoProjects = seoProjects;

    $scope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams){
        if(newState.name == 'app.web.page'){
            var pageName = newStateParams.name; //Variable name matches 
            $scope.linkText = fetchPageContent(pageName);
        }
    });
});

page.web.html のテンプレート

<h1>{{linkText}}</h1>

これらの変更により、コントローラーの同じインスタンスを再利用できるようになります。ページング コンテンツをよりスケーラブルにすることに加えて。

$scopes に関する注意事項

$rootScope を除いて、すべての $scope には親があります。ビューでオブジェクトを要求すると、そのオブジェクトの $scope を調べて参照を見つけます。参照がない場合は、親スコープまでトラバースし、再度検索します。これは、$rootScope に到達するまで発生します。

ビューで $scope に何かを割り当てると、既存のプロパティの $scope チェーンを検索するのではなく、現在の $scope に割り当てられます。それが機能する理由ng-click="model.page = ..."です。モデルの $scope チェーンを検索し、ページ プロパティにng-click="page = ..."割り当てますが、現在の $scope に直接割り当てます。

コントローラー流用時の注意

私の知る限り、ngRoute はネストされたビューをサポートしていません。新しいルートに移動すると、$routeProvider で指定されている現在のビューとコントローラーが破棄され、新しいビューの新しいコントローラーがインスタンス化されます。UI-Router は、ネストされた状態 (つまり、子 $scope を持つ子状態) をサポートします。これにより、すべての子ステート間で再利用できる親コントローラーを作成できます。

于 2014-09-21T01:13:10.623 に答える
-1

これは、スコープがどのように機能するかについての誤解に関連している可能性があると思います。

ng-repeat独自のスコープを作成します。を設定しようとするとpage、angular は ng-repeat のスコープでそれを作成します。

AppCtrlで、次のようにスコープにオブジェクトを作成します。

$scope.model = {};
$scope.model.page = 'Comfort Homes of Athens';//Default value

あなたのng-clickでは、model.pageページだけではなくを参照してください。model.pageAngular は、ng-repeat のローカル スコープでプロパティを作成するだけでなく、スコープをトラバースして検索します。

<span ng-repeat='item in webProjects' ng-click="model.page='{{item.name}}'">{{item.name}}</span>

また、ページを変更するたびに AppCtrl が再作成されます。おそらくサービスを使用して、ページの変更間で状態を保持する必要があります

于 2014-08-06T02:02:15.800 に答える