【问题标题】:Controller $scope attribute does not update (socket connection)控制器 $scope 属性不更新(套接字连接)
【发布时间】:2016-01-09 23:47:51
【问题描述】:

我想让我的 Angular 控制器由与 websockets 连接的工厂更新。

工厂:

function($rootScope, mySocketFactory) {
    mySocketFactory.setHandler('message', function(event) {
        $rootScope.$apply(function() {
            Factory.msg = event.data;
        });
        console.log('factory', Factory.msg);
    });

    var Factory = {};
    Factory.msg = 'init';
    return Factory;
}

控制器:

function ($scope, myFactory) {
    console.log(myFactory.msg);

    $scope.msg = myFactory.msg;
}

部分:

<div data-ng-controller="StatusBarController" class="col-lg-12">
    {{msg}}
</div>

如果工厂通过message 事件console.log('factory', Factory.msg); 获取数据,则返回更新后的值,但控制器不应用更改并坚持init 数据。我在这里做错了什么?

注意:我用数组而不是字符串尝试了相同的示例,它成功了!?首先我认为这可能是因为字符串不是通过引用传递的,但因为我们在 JS 世界中它们是。

【问题讨论】:

    标签: javascript angularjs sockets angularjs-service angularjs-factory


    【解决方案1】:

    您可以创建一个 getter 函数表单工厂,而不是绑定一个属性,该函数表单工厂将返回 msg 属性值,html 上的 {{msg()}} 将在每个摘要周期进行评估,因为您可以随时从服务中运行它您正在接收message

    工厂

    var Factory = {};
    Factory.getMsg = function(){
         return Factory.msg;
    };
    return Factory;
    

    控制器

    function ($scope, myFactory) {
        $scope.msg = myFactory.getMsg;
    }
    

    HTML

    <div data-ng-controller="StatusBarController" class="col-lg-12">
        {{msg()}}
    </div>
    

    更新

    我建议您遵循dot rule 而不是上述方式,这需要声明object,并且该对象将保留属性Factory.data = {msg:'init'};`。一旦你更新了工厂变量,它会自动更新它在你的控制器变量中的引用。

    工厂

    function($rootScope, mySocketFactory) {
        mySocketFactory.setHandler('message', function(event) {
            $rootScope.$apply(function() {
                Factory.data.msg = event.data;
            });
            console.log('factory', Factory.msg);
        });
    
        var Factory = {};
        Factory.data = { msg : 'init'};
        return Factory;
    }
    

    控制器

    function ($scope, myFactory) {
        $scope.info = myFactory.data;
    }
    

    HTML

    <div data-ng-controller="StatusBarController" class="col-lg-12">
        {{info.msg}}
    </div>
    

    【讨论】:

    • 效果很好。所以诀窍是在 html 部分中使用一个函数?这是做这类事情的“标准方式”吗?我是角度世界的新手。
    • 但更重要的是为什么它可以在没有 getter 的情况下使用数组?
    • @messy 看看我的编辑。更新后的答案是正确的,也是拥有它的好习惯。
    • 效果很好,但我还有一个问题。为什么它适用于对象/数组而不适用于字符串?
    • 原始数据类型不适用于那里的引用......就像对象/数组一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多