2016-07-23 11 views
0

新しい角度になっています。アプリケーションをリロードせずにバインディングデータを変更するにはどうすればよいですか。ui-routerを使用して2つの状態に同じコントローラを使用するとデータが瞬時に変更されることはありません

//routes.js 

    function MainRouter ($stateProvider, $urlRouterProvider) { 
    $stateProvider 
    .state ('About', { 
     url: '/about', 
     templateUrl: 'js/about/about.html', 
     controller: 'adminController', 
     controllerAs: 'vm' 
    }) 
    .state ('Admin', { 
     url: '/admin', 
     templateUrl: 'js/admin/admin.html', 
     controller: 'adminController', 
     controllerAs: 'vm' 
    }) 
    } 

私は、ユーザーがページのコンテンツを変更することができます「管理コンソール」とシンプルなウェブサイトを構築しようとしています。アプリは動作していますが、アプリを再ロードせずにコンテンツを更新していません...

'/ admin'ルートには、データベースを更新する関数を介してデータを変更するための入力があります。データベースがページがロードされているときに、ユーザーがログアウトすると変更が残りますが、データをバインドしているので、変更内容をリアルタイムで見ることができます。

//admin.html 

    <div class='about-page-options> 
    <form name='changeAboutTitle' ng-submit='vm.changeContent()'> 
     <div class='about-page-options-title input-field'> 
     <input type='text' ng-model='vm.changeContentInput.aboutTitle'> 
     <label>title</label> 
     </div> 
     <div> 
     <button class='btn' type='submit'>Change</button> 
     </div> 
    </form> 
    </div> 

コントローラにはchangeContent関数があります。

//adminController.js 
    function adminController($http, Upload, adminService){ 
    var vm=this 
    vm.loadContent=loadContent 
    vm.aboutTitle = '' 
    vm.changeContent = changeContent 
    vm.changeContentInput = {} 


//Load Content Page from database when loading the app 
    function loadContent() { 
     console.log('load content triggered') 
     $http({ 
     method:'GET', 
     url:'/api/content' 
     }).then(
     function(res){ 
      vm.aboutTitle = res.data[0].aboutTitle 
     } 
    ); 
    }; 
    loadContent() 

function changeContent() { 
    adminService.changeContent(vm.changeContentInput).then(function (res) { 
    vm.aboutTitle = res.data.aboutTitle 
    }) 
} 
} 
})(); 

この場合、変更したいコンテンツはvm.aboutTitleです。アプリがそれを変更すると、私はページをリロードするときにそれを見ることができます。しかし、vm.itouttitleもnavbarに含まれているので、私はいつもそれを見ることができ、すぐには変わらないと思う。これは、私が修正しているadminコントローラがNavにリンクされているコントローラと同じではないため、ここで大きな問題は、あるコントローラでデータを変更する方法と、同じコントローラの他のインスタンスでも変更することです。

//index.html 
<html ng-app='myapp'> 
     <head> 
     <meta charset='utf-8'> 
     <title>myapp</title>  
     </head> 

    <body> 
    <div class="navbar-fixed" ng-controller='adminController as vm'> 
     <nav> 
     <div class='nav-bar'> 
      <div class='brand-logo'> 
      <div id='logo'>MyLogo</div> 
      </div> 
      <ul> 
      <li><a ui-sref='home' id='home'>Home</a></li> 
      <li><a ui-sref='About'>{{vm.aboutTitle}}</a></li> 
      </ul> 
     </div> 
     </nav> 
    </div> 

    <div ui-view></div> 


</body> 
</html> 

これを解決するのに役立つサービスを作成しましたが、これまでのところ運がありません。何かアドバイス???

//adminService.js 
function adminService ($http) { 
    var service={ 
     changeContent: changeContent 
    } 
    return service; 

    function changeContent (data) { 
     console.log(data) 
     var promise = $http({ 
     method: 'PUT', 
     url: 'api/content', 
     data: data, 
     }).then (
     function (res) { 
      return res; 
     } 
    ) 
     return promise 
    }; 
    } 

そして

//app.js 
(function() { 
    angular.module('myapp', ['ui.router', 'ngResource']); 
})(); 
+0

ヘルプセンターで説明しているように、最小限の完全な例を試してください:http://stackoverflow.com/help/mcve – zoom

答えて

0

それの新しいインスタンスを作成します。同じコントローラを使用するすべてのルート。 一般に、コントローラは状態を保持するように設計されていません。

デザインについてよく読んでみるとTodd's one is goodです。

関連する問題