angularjs – 更新服务更改时的Angular JS指令

前端之家收集整理的这篇文章主要介绍了angularjs – 更新服务更改时的Angular JS指令前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图跟随 this SO answer explaining how to render a recursive JSON structure using a directive.但是,与提供的答案不同,当DOM被加载并且Angular第一次运行时,我的数据是不知道的.

相反,我的数据从HTML输入字段中检索并存储在Angular服务中(用户提交表单时).

当服务的数据被修改时,如何保持角度指令是最新的?

更新响应回答

@musically_ut提供了一个很好的答案,有助于,但揭示了一个相关的问题,阻止实施(在这里更新).

该指令呈现包含角度{{表达式}}的HTML,它访问存储在$scope中的数据.由于原始解决方案是在服务已准备好数据时执行$watch.在指令呈现之前,如何确保将“新”数据添加到$范围?

架构和流程概述如下:

> ControllerA – >从用户获取输入
> ControllerA – >使用服务来转换数据
> ControllerB – > $观看服务变更
>指令 – > $观看服务变更
> ControllerB – >将数据添加到$scope
>指令 – >显示已转换的数据(来自服务)使用
指令

问题出现在步骤5和6之间.在ControllerB将数据添加到$scope之前,该指令呈现{{表达式}}.即使这样做,它感觉方式太复杂和“黑客”.

实际上,为了回归,我在ControllerB中使用$watch来监听变换后的数据是否准备就绪.即使这感觉有点过分(服务不会进行异步调用).

您可以在定义指令时注入服务,然后在数据上设置$watch.所以在你的情况下:
.directive('tree',function ($compile,myService) {
    return {
        // ...
        link: function (scope,element,attrs) {
            scope.$watch(function () {
                return myService.getData();
            },function (newVal) {
                if (typeof newVal !== 'undefined') {
                    // ...
                }
            }
        });
    }
});

这将监视数据进行更改,并在数据更改时运行代码.

然而,如果数据在设置一次后没有更改,更好的方法(更有效)将是从服务返回承诺($http方法直接返回承诺或您可以使用$q服务创建一个),然后将您的计算添加为数据的延续.

.directive('tree',attrs) {
            myService.getData().then(function (data) {
                // ...
            },function (err) {
                // Handle error
            });
        }
    }
});
原文链接:https://www.f2er.com/angularjs/143235.html

猜你在找的Angularjs相关文章