我的控制器如何更新其他控制器的范围变量?

时间:2015-08-06 06:08:09

标签: javascript angularjs

我编写了一个代码,我想要一个返回promise的服务。 现在这个服务我注入了两个控制器,这些控制器不是视图中继承的范围,但是一旦我更新控制器1中的模型值,更新的值就会反映在控制器2上。为什么会这样?

请按照以下代码

<!DOCTYPE html>
<html lang="en" ng-app="MyApp">
<head>
    <title>Recipe 02 example 01</title>
    <script type="text/javascript" src="D:\Rahul Shivsharan\JavaScript-Framework\AngularJS\angular.js"></script>
    <script type="text/javascript" src="D:\Rahul Shivsharan\JavaScript-Framework\jQuery\jquery-1.11.1.js"></script>
    <script type="text/javascript" src="D:\Rahul Shivsharan\JavaScript-Framework\BootstrapCSS\bootstrap-3.2.0-dist\js\bootstrap.js"></script>
    <link rel="stylesheet" href="D:\Rahul Shivsharan\JavaScript-Framework\BootstrapCSS\bootstrap-3.2.0-dist\css\bootstrap.css"></link>
    <link rel="stylesheet" href="D:\Rahul Shivsharan\JavaScript-Framework\BootstrapCSS\bootstrap-3.2.0-dist\css\bootstrap-theme.css"></link>
    <script type="text/javaScript">
        angular.module("MyApp",[]);
        (function(){
            angular.module("MyApp").controller("myCtrlOne",myCtrlOne)
                                   .controller("myCtrlTwo",myCtrlTwo);

            function myCtrlOne(storedValue){
                var obj = this;                 
                obj.myVal = undefined;

                storedValue.get().then(function(value){
                    obj.myVal = value;
                });

            };

            function myCtrlTwo(storedValue){
                var obj = this;
                obj.myVal = undefined;

                storedValue.get().then(function(value){
                    obj.myVal = value;
                });
            };


        })();

        (function(){
            angular.module("MyApp").factory("storedValue",storedValue);

            function storedValue($q){
                var obj = { get : fn },
                    promise = undefined;

                return obj;

                function fn(){
                    return promise || getData();

                    function getData(){
                        promise = $q.when({
                            label : 'Hello',
                            value : 1000
                        });

                        return promise;
                    };
                };
            }
        })();
    </script>
</head>
<body>
    <div ng-controller="myCtrlOne as one">
        <h2>One</h2>
        <label for="">Stored Value:</label>{{one.myVal | json}} <br/>
        Value: <input  type='text' ng-model='one.myVal.value' />
    </div>



    <div ng-controller="myCtrlTwo as two">
        <h2>Two</h2>
        <label for="">Stored Value:</label>{{two.myVal | json}} <br/>
    </div>
</body>     

请参阅下面的jsfiddle链接

My Angular-Promise

我很困惑。

请指导我

1 个答案:

答案 0 :(得分:3)

答案是,您正在缓存工厂的结果。

您可以在线查看缓存的使用情况:

 return promise || getData();

工厂每次注入时都会运行,但会返回缓存的promise。

由于这是一个对象,因此两个控制器都将指向同一个对象。

为你的小提琴添加了一个印刷品。打开控制台,看看&#34;获取数据&#34;只打印一次。

http://jsfiddle.net/3hb0acdk/

function getData(){
    console.log('getting data');
    promise = $q.when({
    label : 'Hello',
    value : 1000
});

这是一个小提琴,会产生2个不同的物体,因此一个不会影响另一个

http://jsfiddle.net/d0queaat/

function fn(){
    return getData();

    function getData(){
        console.log('getting data');
        var promise = $q.when({
            label : 'Hello',
            value : 1000
        });

        return promise;
    };
};