gpt4 book ai didi

angularjs - AngularJS 中的动态服务策略

转载 作者:行者123 更新时间:2023-12-03 17:18:41 25 4
gpt4 key购买 nike

如何即时切换服务并让所有组件(依赖于服务)自动绑定(bind)到新策略的数据?

我有一个 Storage服务和两种存储策略,StorageStrategyAStorageStrategyB . Storage为 Controller 和其他组件提供公共(public)接口(interface)以与之交互:

angular.module('app').factory('Storage', function ($injector) {
var storage;
var setStrategy = function (name) {
storage = $injector.get(name);
};

setStrategy('StorageStrategyB');

return {
getItems: function () {
return storage.getItems();
}
// [...]
};
});

但是当策略改变时,双向绑定(bind)会中断, View 不会更新 getItems() 中的项目。从新战略。

我创建了一个 Plunker来说明问题。

有没有办法将策略模式与 AngularJS 结合起来并保持双向绑定(bind)?

请注意,在我的实际应用中,我不能只调用 Storage.getItems()再次更改策略后,因为有多个组件( View 、 Controller 、范围)依赖 Storage并且服务更改会自动发生。

编辑:
我有 forked the Plunker突出问题。可以看到,上半部分的数据只是因为我手动调用了 Storage.getItems()才更新再次改变策略后。但我不能这样做,因为其他组件 - 例如 OtherController - 也在访问 Storage 上的数据并且还需要自动从新策略中获取数据。相反,他们仍然受制于最初的策略。

最佳答案

Javascript 适用于引用。您在应用程序中的数组项与最初使用以下语句的 strategyB 项的引用相同,并且当您自动更新 StrategyB 项时 项目 在您看来已更新( 因为相同的引用 )。

$scope.items = Storage.getItems();

因此,当您切换策略时,您不会更改 的引用。项目 .它仍然指向 StrategyB 项目引用。

您必须使用以下机制来更改引用。

然后你可以做一些你可以做的事情 communicate Controller 之间更改 项目 引用。

请查找 plunkr我已经更新了。
$rootScope.$broadcast("updateStrategy");

然后更新您的项目列表和其他。
$scope.$on("updateStrategy",function(){
$scope.name = Storage.getName();
$scope.items = Storage.getItems(); //Here changing the reference.
//Anything else to update
});

关于angularjs - AngularJS 中的动态服务策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22272617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com