我有一个带有ng-view(管理面板)的设置,可让我显示订单。我在ng-view之外有一个搜索框,我想用它来修改我的json请求。我看过一些关于访问标题等帖子的帖子,但却无法让它们工作 - 可能已经过时了。
主要应用程序:
angular.module('myApp', ['myApp.controllers', 'myApp.filters', 'myApp.services', 'myApp.directives', 'ui.bootstrap']).
config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {
$routeProvider.
when('/', {
templateUrl: '/partials/order/manage.html',
controller: 'ManageOrderCtrl'
}).
when('/order/:id', {
templateUrl: '/partials/order/view.html',
controller: 'ViewOrderCtrl'
}).
otherwise({
redirectTo: '/'
});
$locationProvider.html5Mode(true);
}]);
管理控制器:
angular.module('myApp.controllers', [])
.controller('ManageOrderCtrl', ['$scope', '$http', '$dialog', 'config', 'Page', function($scope, $http, $dialog, config, Page) {
// would like to have search value from input #search available here
var getData = function() {
$http.get('/orders').
success(function(data, status, headers, config) {
$scope.orders = data.orders;
});
};
getData();
})
查看:
<body ng-app="myApp" >
<input type="text" id="search">
<div class="ng-cloak" >
<div ng-view></div>
</div>
</body>
答案 0 :(得分:37)
如果您要访问<div ng-view></div>
之外的内容,我认为更好的方法是为外部区域创建控制器。然后创建一个服务以在控制器之间共享数据:
<body ng-app="myApp" >
<div ng-controller="MainCtrl">
<input type="text" id="search">
</div>
<div class="ng-cloak" >
<div ng-view></div>
</div>
</body>
(ng-controller="MainCtrl"
也可以放在<body>
标签上 - 然后ng-view $ scope将是MainCtrl $ scope的子节点而不是兄弟节点。)
创建服务就像这样简单:
app.factory('Search',function(){
return {text:''};
});
这样可注射:
app.controller('ManageOrderCtrl', function($scope,Search) {
$scope.searchFromService = Search;
});
app.controller('MainCtrl',function($scope,Search){
$scope.search = Search;
});
这样您就不必依赖于通过全局$ rootScope共享数据(这有点像依赖于javascript中的全局变量 - 出于各种原因一个坏主意)或通过$ parent范围可能或者可能不存在。
我在两个解决方案之间创建了plnkr that tries to show the difference。
答案 1 :(得分:3)
您可以使用范围层次结构。
在HTML中添加“外部”ng-controller
定义,如下所示:
<body ng-controller="MainCtrl">
它将成为$ parent范围。但您不需要使用服务来共享数据。您甚至不需要使用$scope.$parent
范围。您可以使用 scope hierarchies 。 (请参阅该页面上的“范围层次结构”部分)。这真的很容易。
在MainCtrl
中,您可以拥有:
$scope.userName = "Aziz";
然后在任何嵌套在MainCtrl中的控制器(并且不覆盖其自己范围内的userName)也将具有userName!您可以在{{userName}}的视图中使用。
答案 2 :(得分:0)
试试这个......
查看:
<body ng-app="myApp" >
<input type="text" id="search" ng-model="searchQuery" />
<div class="ng-cloak" >
<div ng-view></div>
</div>
</body>
在你的控制器中使用它:
$http.get('/orders?query=' + $scope.searchQuery).
success(function(data, status, headers, config) {
$scope.orders = data.orders;
});
基本上,您可以使用INSIDE-app中的任何内容执行此操作...将您的ng-app移至html
标记,您也可以编辑title
!