2014-03-13 43 views
0

我試圖用相同的json數據顯示我的html頁面的兩個部分,我不想包含在同一個控制器,因爲它位於不同的區域。我曾在 「角服務」 使用本地JSON數據來實現這一概念成功地看到演示單控制器的多個html部分和來自ajax請求的數據angularjs

<div ng-app="testApp"> 
<div ng-controller="nameCtrl"> 
    <a href="#" ng-click="addName();">Add New</a> 
    <a href="#" ng-click="removeName();">Remove First</a> 
    <ul id="first" class="navigation"> 
     <li ng-repeat="myname in mynames">{{myname.name}}</li> 
    </ul> 
</div> 
<div> 
    Lot of things in between 
</div> 

<ul id="second" class="popup" ng-controller="nameCtrl"> 
     <li ng-repeat="myname in mynames">{{myname.name}}</li>   
</ul> 

JS

var testApp = angular.module('testApp', []); 


testApp.service('nameService', function($http) { 
    var me = this; 

    me.mynames = [ 
     { 
      "name": "Funny1" 
     }, 
     { 
      "name": "Funny2" 
     }, 
     { 
      "name": "Funny3" 
     }, 
     { 
      "name": "Funny4" 
     } 
    ]; 

    //How to do 
    /*this.getNavTools = function(){ 
     return $http.get('http://localhost/data/name.json').then(function(result) { 
      me.mynames = result.mynames; 
      return result.data; 
     }); 
    };*/ 



    this.addName = function() { 
     me.mynames.push({ 
      "name": "New Name" 
     }); 
    }; 


    this.removeName = function() { 
      me.mynames.pop(); 
    }; 

}); 

testApp.controller('nameCtrl', function ($scope, nameService) { 

    $scope.mynames  = nameService.mynames; 


    $scope.$watch(
     function(){ return nameService }, 

     function(newVal) { 
      $scope.mynames   = newVal.mynames; 
     } 
    ) 

    $scope.addName = function() { 
     nameService.addName(); 
    } 



    $scope.removeName = function() { 
     nameService.removeName(); 
    } 

}); 

jsfiddle

接下來的事情我想做的是做一個HTTP請求到JSON文件並加載我的兩個部分的數據,如果我添加或刪除它d反映在這兩個領域。

任何指針或存在演示將是非常有用的。

感謝

+0

當你取消對評價方法getNavTools會發生什麼。你只需要抽象你創建的靜態mynames數組來調用getNavTools方法。 – akjha627

+0

我已經更新了演示與http請求,現在發生的是隻有最後一個html部分只更新,如果我點擊添加或刪除鏈接 jsfiddle.net/tomalex0/z6fEf/5/ – tomalex

+0

@ user538776我回答你的問題基於你的更新演示,檢查出來。並請更新您的問題。 –

回答

1

之所以只有一個ngRepeat是更新是因爲它們綁定到兩個不同的陣列。

它怎麼會發生?這是因爲您撥打了getNavTools()兩次,並且在每次通話中,您已將mynames替換爲新的陣列!最後,addName()removeName()正在處理最後指定的mynames陣列,因此您會看到問題所在。

我有修復你:

testApp.service('nameService', function($http) { 
    var me = this; 
    me.mynames = []; // me.mynames should not be replaced by new result 

    this.getNavTools = function(){ 
     return $http.post('/echo/json/', { data: data }).then(function(result) { 
      var myname_json = JSON.parse(result.config.data.data.json); 
      angular.copy(myname_json, me.mynames); // update mynames, not replace it 
      return me.mynames; 
     }); 
    }; 

    this.addName = function() { 
     me.mynames.push({ 
      "name": "New Name" 
     }); 
    }; 


    this.removeName = function() { 
     me.mynames.pop(); 
    }; 
}); 

testApp.controller('nameCtrl', function ($scope, nameService) { 

    // $scope.mynames  = nameService.mynames; // remove, not needed 

    nameService.getNavTools().then(function() { 
     $scope.mynames = nameService.mynames; 
    }); 

    /* Remove, not needed 
    $scope.$watch(
     function(){ return nameService }, 

     function(newVal) { 
      $scope.mynames   = newVal.mynames; 
     } 
    ); 
    */ 

    $scope.addName = function() { 
     nameService.addName(); 
    }; 

    $scope.removeName = function() { 
     nameService.removeName(); 
    }; 
}); 

http://jsfiddle.net/z6fEf/9/

+0

完美,它的作品像魅力 – tomalex

0

你可以做的是把數據放到父作用域(也許在$ rootScope),它會觸發兩種觀點,而你並不需要$看這裏..

$rootScope.mynames  = nameService.mynames; 

jsFiddle

+0

嘗試限制污染$ rootScope。在你的情況下,我只是創建另一個控制器並使用相同的服務。一個控制器應該只是負責你網頁上的一個組件。 – victormejia

+0

是的這是真的,也許他可以有一個頂級控制器涵蓋HTML視圖... –

相關問題