2014-09-18 81 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

相關問題