与其他控制器共享所选的选择

时间:2014-09-18 15:35:22

标签: javascript angularjs

我正在尝试与另一个控制器共享一个选定的选项(当我选择一个新选项时让它更新)。可能像控制器之间的双向数据绑定一样工作。

我通过建立像这样的工厂来尝试这个

.factory("shareObjective", function($scope){

     var shareObjective = {};
     return {
         shareObjective: shareObjective,
     };
})

然后我将它注入控制器并将其绑定到选择的模型,如此

$scope.selectModel = shareObjective.shareObjective;

我似乎在让这个工作上遇到一些麻烦。我基本上只是想与另一个控制器共享所选择的选项(它的.name是准确的),并且我正在努力这样做。我的第一步是让它分享到工厂开始,但我似乎没有运气尝试这一点。我应该使用像$ broadcast这样的东西来保持信息流畅通吗?谢谢!

编辑 - 这是一个笨蛋http://plnkr.co/edit/L5lz4etQ7mUEhf9viNOk?p=preview

1 个答案:

答案 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]);

Here's the fiddle.

请注意,我的代码不使用单个控制器,只使用单个控制器实现。您可以编写自己的MyCtrl1Myctrl2实现,这些实现都包含此代码。

此外,虽然看起来这会在$watch$on之间产生无限循环,但事实并非如此。 $scope.foo = data;不会触发$watch