$scope 不是模型,它是对模型的引用,粘在数据和视图之间。如果 $scope 有两个或更多,控制器需要共享一个模型/状态/数据,通过注册一个角度服务来使用单例对象实例。可以将一个服务/工厂注入到任意数量的控制器中,然后一切都可以从这一事实来源中发挥作用。
这是 1 个工厂将导航栏和正文中的 $scopes 与 ui-router http://plnkr.co/edit/P2UudS?p=preview 链接的演示(仅限左侧选项卡)
ui-router(viewC 是导航栏):
$stateProvider
.state('left', {
url: "/",
views: {
"viewA": {
controller: 'LeftTabACtrl',
template: 'Left Tab, index.viewA <br>' +
'<input type="checkbox" ng-model="selected2.data" />' +
'<pre>selected2.data: {{selected2.data}}</pre>'
},
{...},
"viewC": {
controller: 'NavbarCtrl',
template: '<span>Left Tab, index.viewC <div ui-view="viewC.list"></div>' +
'<input type="checkbox" ng-model="selected.data" />' +
'<pre>selected.data: {{selected.data}}</pre></span>'
}
}
})
工厂和控制器:
app.factory('uiFieldState', function () {
return {uiObject: {data: null}}
});
app.controller('NavbarCtrl', ['$scope', 'uiFieldState', '$stateParams', '$state',
function($scope, uiFieldState, $stateParams, $state) {
$scope.selected = uiFieldState.uiObject;
}
]);
app.controller('LeftTabACtrl', ['$scope', 'uiFieldState', '$stateParams', '$state',
function($scope, uiFieldState, $stateParams, $state) {
$scope.selected2 = uiFieldState.uiObject;
}
]);
如您所见,工厂对象{uiObject: {data: null}} 被注入到带有uiFieldState 的控制器中,然后它只是$scope.selected = uiFieldState.uiObject; 用于将工厂连接到范围ng-model="selected.data"
.`