AngularJS : How to create a two-way data binding between two isolated controllers and a shared service?

后端 未结 3 1845
独厮守ぢ
独厮守ぢ 2020-12-31 08:29

I am trying to create a two-way data binding between two isolated controllers and a shared service (which provides another isolated scope):

app.factory(\"sha         


        
相关标签:
3条回答
  • 2020-12-31 08:46

    JavaScript passes objects by reference, so all scopes will point to the same object. Why not just do this?

    app.factory("sharedData", function() {
        return {data: "init text from factory"};
    });
    
    app.controller("first", function($scope, sharedData) {
        $scope.sharedData = sharedData;
    });
    
    app.controller("second", function($scope, sharedData) {
        $scope.sharedData = sharedData;
    });
    

    and in your view:

    <p>{{sharedData.data}}</p>
    
    0 讨论(0)
  • 2020-12-31 08:50

    Fixed it. References will be lost if you are using primitives, as in your fiddle.

    Check this:

    Updated fiddle

    app.factory("sharedScope", function($rootScope) {
        var scope = $rootScope.$new(true);
        scope.data = {text: "init text from factory"};
        return scope;
    });
    
    app.controller("first", function($scope, sharedScope) {
        $scope.data1 = sharedScope.data;
    });
    
    app.controller("second", function($scope, sharedScope) {
        $scope.data2 = sharedScope.data;
    });
    
    0 讨论(0)
  • 2020-12-31 08:50

    Yet another fun bit: In this case, you don't need to inject $scope or $rootScope. The following code works if you utilize Controller As. Check the Fiddle

    var app = angular.module("app", []);
    
    app.factory("sharedScope", function() {
        var _this = this;
        _this.data = {text: "init text from factory"};
        return _this;
    });
    
    app.controller("first", function(sharedScope) {
        var _this = this;
        _this.data1 = sharedScope.data;
    });
    
    app.controller("second", function(sharedScope) {
        var _this = this;
        _this.data2 = sharedScope.data;
    });
    

    For even more fun, consider controllers, services, and factories as classes. More Fiddles

    var app = angular.module("app", []);
    
    var SharedScope = function(){
        var _this = this;
        _this.data = {text: "init text from factory"};
        return _this;
    };
    
    app.factory("sharedScope", SharedScope);
    
    var First = function(sharedScope){
        var _this = this;
        _this.data1 = sharedScope.data;
    };
    
    var Second = function(sharedScope){
        var _this = this;
        _this.data2 = sharedScope.data;
    };
    
    First.$inject = ['sharedScope'];
    Second.$inject = ['sharedScope'];
    
    app.controller("first", First);              
    app.controller("second", Second);
    

    I've been playing at implementing Josh Carroll's Guidelines to Avoid "Scope Soup"

    0 讨论(0)
提交回复
热议问题