2015-03-31 1 views
4

В правильном состоянии ui-router с угловым состоянием контроллер запускается каждый раз, когда состояние активировано. Я обнаружил, что это не так, когда речь идет о названных представлениях в ионном приложении. Именованный контроллер представления запускается только один раз для элемента (игры). Например. пользователь показывает запуск игры ->. Затем пользователь переходит в другое состояние и по возвращении к отображению того же игрового контроллера снова не запускается - представление использует уже сгенерированную область ранее. Я хотел бы повторно инициализировать, что игры с контроллером.Как запускать контроллер каждый раз, когда активируется угловой символ ui-router?

Мой код:

//app.js 
.state('app.game', { 
    url: "/x/{gameID:int}", 
    views: { 
    'menuContent': { 
     templateUrl: "templates/html/my-game.html", 
     controller: 'GameCtrl' 
    } 
    } 
}) 

...

//controllers.js 
controllers.controller('GameCtrl', function ($scope, $stateParams, Game) { 
    //alert("running controller"); 
    Game.get({id: $stateParams.gameID}, function(res){ 
    $scope.game = res; 
    }); 
}) 

Edit: Я использую этот код, чтобы перейти к просмотру игры (в настоящее время играет с Guid идеи от Стивена Wexler)

<ion-view view-title="Games"> 
    <ion-content> 
    <h1>Games</h1> 
    <ion-list> 
    <ion-item nav-clear menu-close href="#/app/x/{{game.id}}?guid= {{guid()}}" ng-repeat="game in games"> 
     {{game.id}} 
    </ion-item> 
    </ion-list>  
    </ion-content> 
</ion-view> 

ответ

6

Я думаю, ваша проблема у решено в этом посте Angular/Ionic - controller only runs once brandyshea говорит, что вам нужно добавить код, который вы хотите запустить в $ionicView.enter случае

controller : function($scope, $cordovaSQLite){ 
    $scope.$on('$ionicView.enter', function() { 
     // code to run each time view is entered 
    }); 

    ... 
}); 
+0

это, кажется, то, что я ищу. Я скоро обновлю вас. – user1167937

+0

Не забудьте сказать, что это работает нормально, и если вы можете пометить этот ответ как полезный, пожалуйста, – Matho

+0

Хорошо, так что другой вопрос о stackoverflow был примерно таким же вопросом (мой плохо!). Ваш ответ кажется правильным, но лучше всего для меня было добавить «cache: false» в состояние app.game. Больше в документации, связанной с другим вопросом. Спасибо вам всем. – user1167937

0

Возможно, вы перемещаетесь в состояние с теми же url и параметрами, которые были загружены ранее. Один из способов принудительного перезагрузки - передать в guid в качестве параметра с вашим состоянием и установить reloadOnSearch=true (по умолчанию это правда). Второй способ принудительной перезагрузки - использовать параметр перезагрузки, добавленный в версии 0.2.5.

Вариант 1

.state('app.game', { 
    url: "/x/{gameID:int}/{guid}", 
    views: { 
    'menuContent': { 
     templateUrl: "templates/html/my-game.html", 
     controller: 'GameCtrl' 
    } 
    } 
}) 

$state.go("app.game", { gameId: id, guid: guid }); 

function guid() { 
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 
    var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); 
    return v.toString(16); 
    }); 
} 

Вариант 2 (если у вас есть версия> = 0.2.5)

.state('app.game', { 
    url: "/x/{gameID:int}", 
    views: { 
    'menuContent': { 
     templateUrl: "templates/html/my-game.html", 
     controller: 'GameCtrl' 
    } 
    }, 
    reload: true 
}) 

Примечание: Удивительная функция справ копируется из Create GUID/UUID in JavaScript?

+0

извините, я не могу upvote вызывает мой низкий респ. Я пошел с более ионным конкретным решением, но это кажется очень хорошим качеством. Thx – user1167937

Смежные вопросы