2014-09-18 85 views
0

我试图与另一个控制器共享选定的选项(并在选择新选项时进行更新)。有些东西可以像控制器之间的双向数据绑定一样工作。将选定的选项与另一个控制器共享

我已经设立了一个工厂,像这样

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

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

尝试这个然后我注入到这个控制器,并将其绑定到选择的模型,像这样

$scope.selectModel = shareObjective.shareObjective; 

我似乎在工作中遇到麻烦。我基本上只是想与另一个控制器共享选定的选项(它的名称是准确的),并且正在努力实现。我的第一步是先把它分享到工厂,但我似乎没有尝试这样做。我应该使用类似$广播的方式来保持信息流畅通吗?谢谢!

编辑 - 这里有一个plunkr http://plnkr.co/edit/L5lz4etQ7mUEhf9viNOk?p=preview

+0

您可以设置一个重击器吗?它应该是 – harishr 2014-09-18 15:43:00

+0

什么是不工作?它是否在工厂更改时不更新? – sma 2014-09-18 15:47:09

+0

我会做一个plunkr。谢谢! – ajmajmajma 2014-09-18 16:03:42

回答

0

是的,这不会在默认情况下是因为你使用两个不同的范围因而不同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]); 

Here's the fiddle.

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

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

+0

这是否必须用rootcope完成?谢谢! – ajmajmajma 2014-09-18 16:26:09

+0

$ broadcast将事件向范围树发送,所以您可以从两个控制器的任何公共父级发出它。 $ scope。$ parent应该没问题。 – 2014-09-18 20:00:35

相关问题