簡體   English   中英

AngularJS從$ stateProvider設置的控制器上的指令中調用函數?

[英]AngularJS Calling a Function from a Directive on a Controller set by the $stateProvider?

我已經設置了stateProvider,它為每個Tab設置了一個不同的控制器:

app.config(function($stateProvider, $urlRouterProvider) {
    $stateProvider.state('home', {
        url : "/home",
        templateUrl : "main.html",
        controller : 'HomeCtrl'
    }).state('top', {
        url : "/top",
        templateUrl : "main.html",
        controller : 'TopCtrl'
    }).state('trending', {
        url : "/trending",
        templateUrl : "main.html",
        controller : 'TrendingCtrl'
    });
    $urlRouterProvider.otherwise('/home');
});

主控制器的應用如下:

app.controller("MainCtrl", function($scope, $location, $log) {
    $scope.selectedIndex = 0;
    $scope.$watch('selectedIndex', function(current, old) {
        switch (current) {
        case 0:
            $location.url("/home");
            break;
        case 1:
            $location.url("/top");
            break;
        case 2:
            $location.url("/trending");
            break;
        }
    });
});
...
<body ng-app="storeApp" layout="row" ng-controller="MainCtrl" ng-cloak>

我還創建了一個應用於選項卡容器的指令:

app.directive("autoLoad", function ($window) {
    return {
        scope: {
            load: '&load'
        },
        controller : function($scope, $element) {
            var scroller = $element;
            angular.element($window).bind("scroll", function() {
                if(($(window).scrollTop() + $(window).height()) > ($(document).height() - 100)) {
                    console.log("LOG 1");
                    $scope.load(); // LOAD POSTS
                }
            });
        }
    };
});

標簽容器:

<div flex layout="column" tabIndex="-1" role="main"
    class="md-whiteframe-z2" auto-load load="loadMorePosts()">
    <md-toolbar layout="row" layout-align="center center">

上面列出的每個控制器:HomeCtrl,TopCtrl和TrendingCtrl如下所示:

app.controller("HomeCtrl", function($scope, controllerManager) {
    // LOAD MORE POSTS:
    $scope.loadMorePosts = function() {
        console.log("LOG 2");
    };
});

每個控制器都有其自己的loadMorePosts函數。 在某些情況下,我正在創建一個無限滾動系統,因此當用戶滾動到頁面底部時,將調用loadMorePosts函數。 但是,在這種情況下,永遠不會調用該函數,也永遠不會記錄“ LOG 2”。 但是,會調用“ LOG 1”,因此滾動邏輯起作用。

我發現問題可能是該指令內部使用的范圍是指MainCtrl控制器的范圍,而不是由stateProvier設置的各個控制器。 我試圖將ng-controller動態地應用於選項卡容器,但這會導致“多個指令錯誤”。

再次,我只是假設這是導致問題的原因,我可能是錯的。

編輯:問題似乎是作用域引用了mainCtrl控制器。 如果我將loadMorePosts方法放在該控制器內部,則會調用該函數。 因此,如何確定作用域引用的是當前選項卡的控制器而不是mainCtrl。

編輯:選項卡容器的html:

<body ng-app="storeApp" layout="row" ng-controller="MainCtrl" ng-cloak>
<script type="text/ng-template" id="/html/main.html"></script>
<script type="text/ng-template" id="/html/login.html"></script>
<div flex layout="column" tabIndex="-1" role="main"
    class="md-whiteframe-z2" auto-load load="loadMorePosts">
    <md-toolbar layout="row" layout-align="center center">
    <h1>
        <img id="mainLogo" src="../images/logo.png" height="5%">
    </h1>
    </md-toolbar>
    <md-tabs md-dynamic-height md-center-tabs md-selected="selectedIndex">
        <md-tab>
            <md-tab-label>
                <md-icon class="in-line" md-font-library="material-icons">home</md-icon>
                <div class="in-line">New</div>
            </md-tab-label>
            <md-tab-body>
                <div ui-view flex></div>
            </md-tab-body>
        </md-tab>
        <md-tab>
            <md-tab-label>
                <md-icon class="in-line" md-font-library="material-icons">star</md-icon>
                <div class="in-line">Top</div>
            </md-tab-label>
            <md-tab-body>
                <div ui-view flex></div>
            </md-tab-body>
        </md-tab>
       <md-tab>
            <md-tab-label>
                <md-icon class="in-line" md-font-library="material-icons">whatshot</md-icon>
                <div class="in-line">Hot</div>
            </md-tab-label>
            <md-tab-body>
                <div ui-view flex></div>
            </md-tab-body>
        </md-tab>
    </md-tabs> 
</div>

...

嘗試這個,

app.directive("autoLoad", function ($window) {
    return {
        scope: {
            load: '=' // here you specify that the name load is same as in the attribute
        },
        controller : function($scope, $element) {
            var scroller = $element;
            angular.element($window).bind("scroll", function() {
                if(($(window).scrollTop() + $(window).height()) > ($(document).height() - 100)) {
                    console.log("LOG 1");
                    $scope.load(); // LOAD POSTS
                }
            });
        }
    };
});

更新資料

像這樣更改html,

<div flex layout="column" tabIndex="-1" role="main"
    class="md-whiteframe-z2" auto-load load="loadMorePosts"> 

更新2

app.controller("MainCtrl", function($scope, $location, $log) {
    $scope.loadMorePosts = function() {
      console.log("main controller");
    };
});

app.controller("HomeCtrl", function($scope, controllerManager) {
    // LOAD MORE POSTS:
    $scope.$parent.loadMorePosts = function() {
        console.log("Home controller");
    };
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM