如何从AngularJS中的另一个模块更新的模块中获取最新数据
我有3个AngularJS模块,如何从AngularJS中的另一个模块更新的模块中获取最新数据,angularjs,Angularjs,我有3个AngularJS模块,M一个模块是模型持有者/管理者,另外2个模块是app,是主模块,a将操作M模块的数据。app和A都依赖于M 为简单起见,该模型只是一个动物名称数组,我想从模块A中添加新名称,这些名称是我希望在appmodule控制的列表中看到的 这就说明了这一点 我实现了本文中建议的中介模式,因此我的模型模块M将向其订阅者发布其更改 app有一个控制器NamesListCtrl,该控制器从NamesModel工厂从M读取数据,并订阅其事件NamesModelChanged,每当N
M
一个模块是模型持有者/管理者,另外2个模块是app
,是主模块,a
将操作M
模块的数据。app
和A
都依赖于M
为简单起见,该模型只是一个动物名称数组,我想从模块A
中添加新名称,这些名称是我希望在app
module控制的列表中看到的
这就说明了这一点
我实现了本文中建议的中介模式,因此我的模型模块M
将向其订阅者发布其更改
app
有一个控制器NamesListCtrl
,该控制器从NamesModel
工厂从M
读取数据,并订阅其事件NamesModelChanged
,每当NamesModel
内部数据更改时,该事件就会发布
问题:调用NamesListCtrl
订阅NamesModelChanged
的匿名回调时(plunk中的第87行),语句$scope.data.namesList=NamesModel.getAll()代码>将不会检索更新的数据:
NamesModel.subscribe('NamesModelChanged', function() {
console.log('OK, I will update my data');
// not getting the updated list
$scope.data.namesList = NamesModel.getAll();
});
有什么帮助吗?当控制器和模型将初始化并加载页面时,您需要初始化$scope.data.namesList变量,并通过$scope.data.namesList=NamesModel.getAll();,为此分配一个数据,然后,无论何时调用它,它都会返回更新的数据,结论是,当您最初创建范围变量时,您需要使其成为实时的活动对象/变量 当控制器和模型将初始化且页面正在加载时,您需要初始化$scope.data.namesList变量,并通过$scope.data.namesList=NamesModel.getAll()为其分配一个数据,然后,无论何时调用它,它都会返回更新的数据,结论是,当您最初创建范围变量时,您需要使其成为实时的活动对象/变量 有两件事解决了:
1) 从名称模型
工厂中调用的发布
应包括列表
,以便其他控制器中的订阅
回调将获得新数据,因此假设将发布列表命名为新列表
的回调,只需调用$scope.data.namesList=newList
即可更新NamesListCtrl
中的数据
2) 然后需要调用$scope.$digest()
,以强制用户界面刷新
这是新的工作模式
谢谢,谢谢你的帮助。有两件事解决了:
1) 从名称模型
工厂中调用的发布
应包括列表
,以便其他控制器中的订阅
回调将获得新数据,因此假设将发布列表命名为新列表
的回调,只需调用$scope.data.namesList=newList
即可更新NamesListCtrl
中的数据
2) 然后需要调用$scope.$digest()
,以强制用户界面刷新
这是新的工作模式
谢谢,谢谢您的帮助。这里的问题似乎是您的NamesModel
是工厂而不是服务。每次注入工厂时,都会返回工厂运行的函数,这意味着您有多个列表。当App Module
听到发布消息时,它会对工厂返回的函数的自身实例调用getAll
函数,而Module A
会更新不同的实例。服务不会有这个问题,因为服务是单例的,这意味着只能有一个实例。是的,我知道工厂也是单例的,但实际上这意味着总是返回相同的函数,但函数仍然被多次调用,每个注入它的控制器调用一次,因此,每个应用程序都会获得工厂返回的对象的相同(在应用程序启动时)版本,但仍然是单个实例。这里的问题似乎是,您的名称模型
是工厂而不是服务。每次注入工厂时,都会返回工厂运行的函数,这意味着您有多个列表。当App Module
听到发布消息时,它会对工厂返回的函数的自身实例调用getAll
函数,而Module A
会更新不同的实例。服务不会有这个问题,因为服务是单例的,这意味着只能有一个实例。是的,我知道工厂也是单例的,但实际上这意味着总是返回相同的函数,但函数仍然被多次调用,每个注入它的控制器调用一次,因此,每个应用程序都会获得工厂返回的对象的相同版本(在应用程序启动时),但仍然是单独的实例。