Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从AngularJS中的另一个模块更新的模块中获取最新数据_Angularjs - Fatal编程技术网

如何从AngularJS中的另一个模块更新的模块中获取最新数据

如何从AngularJS中的另一个模块更新的模块中获取最新数据,angularjs,Angularjs,我有3个AngularJS模块,M一个模块是模型持有者/管理者,另外2个模块是app,是主模块,a将操作M模块的数据。app和A都依赖于M 为简单起见,该模型只是一个动物名称数组,我想从模块A中添加新名称,这些名称是我希望在appmodule控制的列表中看到的 这就说明了这一点 我实现了本文中建议的中介模式,因此我的模型模块M将向其订阅者发布其更改 app有一个控制器NamesListCtrl,该控制器从NamesModel工厂从M读取数据,并订阅其事件NamesModelChanged,每当N

我有3个AngularJS模块,
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
会更新不同的实例。服务不会有这个问题,因为服务是单例的,这意味着只能有一个实例。是的,我知道工厂也是单例的,但实际上这意味着总是返回相同的函数,但函数仍然被多次调用,每个注入它的控制器调用一次,因此,每个应用程序都会获得工厂返回的对象的相同版本(在应用程序启动时),但仍然是单独的实例。