我正在尝试与另一个控制器共享一个选定的选项(当我选择一个新选项时让它更新)。可能像控制器之间的双向数据绑定一样工作。
我通过建立像这样的工厂来尝试这个
.factory("shareObjective", function($scope){
var shareObjective = {};
return {
shareObjective: shareObjective,
};
})
然后我将它注入控制器并将其绑定到选择的模型,如此
$scope.selectModel = shareObjective.shareObjective;
我似乎在让这个工作上遇到一些麻烦。我基本上只是想与另一个控制器共享所选择的选项(它的.name是准确的),并且我正在努力这样做。我的第一步是让它分享到工厂开始,但我似乎没有运气尝试这一点。我应该使用像$ broadcast这样的东西来保持信息流畅通吗?谢谢!
编辑 - 这是一个笨蛋http://plnkr.co/edit/L5lz4etQ7mUEhf9viNOk?p=preview
答案 0 :(得分:0)
是的,默认情况下这不起作用,因为您使用两个不同的范围,因此使用不同的ngModel。
使用服务也无济于事,因为即使在一个范围内单击带有ngModel的select也会触发该范围内的摘要循环,它也不会在另一个范围内触发它。
正如您自己建议的那样,您需要以某种方式通知其他范围更新自己,是的,您可以通过事件($broadcast
和$on
)执行此操作:
两个控制器都包含
<select
ng-model="foo"
ng-options="foo for foo in foos"
></select>
这是JS:
var foos = [
'foo1',
'foo2',
'foo3'
];
function MyCtrl($scope, $rootScope) {
$scope.foo = foos[0];
$scope.foos = foos;
// detect broadcasts from other controllers and set our value to the one we received
$rootScope.$on('foo-event', function(e, data) {
$scope.foo = data;
});
// detect when foo changes and broadcast it's value
$scope.$watch('foo', function() {
$rootScope.$broadcast('foo-event', $scope.foo);
});
}
myApp.controller('MyCtrl1', ['$scope', '$rootScope', MyCtrl]);
myApp.controller('MyCtrl2', ['$scope', '$rootScope', MyCtrl]);
请注意,我的代码不使用单个控制器,只使用单个控制器实现。您可以编写自己的MyCtrl1
和Myctrl2
实现,这些实现都包含此代码。
此外,虽然看起来这会在$watch
和$on
之间产生无限循环,但事实并非如此。 $scope.foo = data;
不会触发$watch
,