第一個View中點選按鈕,透過ui-router跳轉按鈕到第二個View,在第二個controller中能接收到數據,賦值給$scope,但是頁面上沒顯示。
第一個View:
<a type="button" ui-sref="index.usermng.userInfo" ng-click="checkUserInfo(item.id)" class="btn btn-primary">查看</a>
第一個controller中的方法:
$scope.checkUserInfo = function(userId) {
$rootScope.$broadcast('toUserInfo', userId);
}
第二個View:
<p class="tab-pane active tab-chrome" id="tab-chrome">
<p class="row feature">
<p class="col-md-12">
<ul class="list-group">
<li class="list-group-item">UserId:{{data.user.userId}}</li>
<li class="list-group-item">Name:{{data.user.name}}</li>
<li class="list-group-item">Sex:{{data.user.sex}}</li>
<li class="list-group-item">Birthday:{{data.user.birthday | date:'yyyy-MM-dd'}}</li>
<li class="list-group-item">Mobile:{{data.user.mobile}}</li>
</ul>
</p>
</p>
</p>
第二controller:
userApp.controller('userInfoCtrl', ['$scope', '$http', '$rootScope', 'serverUrl', function($scope, $http, $rootScope, serverUrl) {
$rootScope.$on('toUserInfo', function(event, userId) {
console.log(userId); //能获取到ID
$scope.userId = userId;
$http.get(serverUrl + "/user/info?userId=" + userId).success(function(data) {
console.log(data); //有data
$scope.data = data.data; //赋值后页面不显示
})
})
}])
ui-router:
.state('index.usermng.userInfo',{
url: '/userInfo',
templateUrl: 'tpls/userInfo.html',
controller: 'userInfoCtrl'
})
世界只因有你2017-05-15 16:56:16
我勒個去,瞅了半天才明白你用 $rootScope
的目的,就為了傳個 ID 啊~也蠻拼的…
你也別糾結為什麼視圖不顯示了,還是跟你講一下正確的做法。
首先是 ui-router 的寫法:
javascript
.state('index.usermng.userInfo', { url: '/userInfo/:id', templateUrl: 'tpls/userInfo.html', controller: 'userInfoCtrl', resolve: { userInfo: function($http, serverUrl, $stateParams) { return $http.get(serverUrl + "/user/info?userId=" + $stateParams.id) } } })
然後,有了這個 state 之後,第一個視圖就可以寫成:
html
<a ui-sref="index.usermng.userInfo({id: item.id})" class="btn btn-primary">查看</a>
第一個控制器裡就不需要 checkUserInfo
方法了;第二個視圖沒什麼問題,不用改了;第二個控制器如下:
javascript
userApp.controller('userInfoCtrl', function($scope, userInfo) { userInfo.then(function(response) { $scope.data = response.data }) })
就這樣。我在 resolve
那里返回的是 promise,所以 controller 里接收的时候要用 then
方法。这样做的好处是可以在 http 请求完成之前有多一次机会让你干别的(比如弄个 loading 状态之类的事情);如果你不需要,也可以在 resolve
那里返回 return $http.get(...).then(function(response) { return response.data })
,這樣在 controller 裡就直接拿到資料本身了。