与其他控制器共享选定的选择
Share selected select with another controller
我正试图与另一个控制器共享所选选项(并在选择新选项时更新它)。类似于控制器之间的双向数据绑定。
我尝试过建立一个像这样的工厂
.factory("shareObjective", function($scope){
var shareObjective = {};
return {
shareObjective: shareObjective,
};
})
然后我将其注入控制器,并将其绑定到select的模型上,就像一样
$scope.selectModel = shareObjective.shareObjective;
我似乎很难让它发挥作用。基本上,我只想与另一个控制器共享选定的选项(准确地说是.name),但我很难做到这一点。我的第一步是首先将其共享到工厂,但我似乎在尝试这一点时运气不佳。我应该使用类似$broadcast的东西来保持信息流的开放吗?谢谢
编辑-这里有一个plunkerhttp://plnkr.co/edit/L5lz4etQ7mUEhf9viNOk?p=preview
是的,这在默认情况下不起作用,因为您使用两个不同的作用域,因此ngModels不同。使用服务也没有帮助,因为即使在一个作用域中单击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
,
相关文章:
- 下拉选择可自动更改第二个下拉选择
- 如何使用jQuery选择下拉列表的值
- jquery点击函数select&取消选择
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 按照选项卡索引的顺序循环一个jQuery选择
- 在动态创建的元素上获取对特定选择器的引用
- KnockoutJs - 共享可观察数组以提供更多选择
- 如何创建共享单个列表的链接下拉列表,并确保只能在一个下拉列表中选择每个值
- jQuery"OR”;具有共享修饰符的选择器
- 允许用户选择要共享的图像
- 如何在共享JavaScriptAMD模块时选择依赖项名称
- 与其他控制器共享选定的选择
- 如何在HTML和动态选择之间共享信息?-AngularJS
- Jquery-在共享相同类名的其他元素之间选择一个元素(单击时)
- 谷歌共享在共享时没有选择正确的图像
- 如何通过授权信息有选择地允许跨域资源共享
- 突出显示<td>如果两个选择输入共享一个值
- 在下拉项中共享一个通用值,并在选择时调整该值
- 共享IE7中的此问题-无法选择/单击弹出表单下方的任何内容
- Open Graph用于Facebook共享选择错误的图像