Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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,我正在尝试显示我的服务中的对象(songTitle)。将显示初始状态(tmp)。如果我正在更改服务中的对象,则视图不会得到更新 Js: HTML 问题出在onPlayerReady函数中。行songTitle=player.getVideoData().title不会在您的服务上设置songTitle,而是在全局范围(即窗口对象)上设置。简单地使用this.songTitle也不会有帮助,因为this在onPlayerReady的范围内也不涉及您的服务 最简单的解决方案是将对您的服务的引用保存在

我正在尝试显示我的服务中的对象(songTitle)。将显示初始状态(tmp)。如果我正在更改服务中的对象,则视图不会得到更新

Js:

HTML


问题出在
onPlayerReady
函数中。行
songTitle=player.getVideoData().title
不会在您的服务上设置
songTitle
,而是在全局范围(即
窗口
对象)上设置。简单地使用
this.songTitle
也不会有帮助,因为
this
onPlayerReady
的范围内也不涉及您的服务

最简单的解决方案是将对您的服务的引用保存在
onPlayerReady
之外,然后使用它分配
songTitle

var self = this;
function onPlayerReady() {
  console.log("db ready");
  self.songTitle = player.getVideoData().title;
  console.log(self.songTitle);
}
然而,这还不够。由于您从Angular world(Youtube播放器回调)之外更改了
songTitle
,因此需要调用
$scope.$apply
通知Angular发生了更改

为此,您需要将$rootScope注入到您的服务中:

party.service('PlayerService', function ($window, $rootScope)
并使用
$rootScope.$apply
更改
songTitle

var self = this;
function onPlayerReady() {
  console.log("db ready");
  $rootScope.$apply(function() {
    self.songTitle = player.getVideoData().title;
    console.log(self.songTitle);
  });
}

问题出在
onPlayerReady
函数中。行
songTitle=player.getVideoData().title
不会在您的服务上设置
songTitle
,而是在全局范围(即
窗口
对象)上设置。简单地使用
this.songTitle
也不会有帮助,因为
this
onPlayerReady
的范围内也不涉及您的服务

最简单的解决方案是将对您的服务的引用保存在
onPlayerReady
之外,然后使用它分配
songTitle

var self = this;
function onPlayerReady() {
  console.log("db ready");
  self.songTitle = player.getVideoData().title;
  console.log(self.songTitle);
}
然而,这还不够。由于您从Angular world(Youtube播放器回调)之外更改了
songTitle
,因此需要调用
$scope.$apply
通知Angular发生了更改

为此,您需要将$rootScope注入到您的服务中:

party.service('PlayerService', function ($window, $rootScope)
并使用
$rootScope.$apply
更改
songTitle

var self = this;
function onPlayerReady() {
  console.log("db ready");
  $rootScope.$apply(function() {
    self.songTitle = player.getVideoData().title;
    console.log(self.songTitle);
  });
}

songTitle
与此不同。songTitle即使我写了这个。songTitle=player.getVideoData().title;它在您的服务中不起作用,您应该返回一个对象,其中包含对所需变量和函数的引用,如下所示:
return{var:var}
,您可以从控制器(如Service.Var)访问它,
songTitle
实际分配了新值的代码在哪里?
songTitle
与此不同。songTitle即使我写了这个。songTitle=player.getVideoData().title;它在您的服务中不起作用,您应该返回一个对象,其中引用了您想要的变量和函数,如:
return{var:var}
,这样,您可以从控制器(如服务)访问它。var
songtile
实际分配了新值的代码在哪里?您的答案似乎是正确的,但是标题仍然不会在视图上更新。我将日志添加到playvideo函数中,该函数将被称为aftter onPlayerReady。我看到对象被更新了,但旧值仍然显示在视图上,仍然不起作用,我想angular无法识别该更改。我想我必须使用一些解决方案,从你的答案似乎是合法的,但标题仍然不会更新的看法。我将日志添加到playvideo函数中,该函数将被称为aftter onPlayerReady。我看到对象被更新了,但旧值仍然显示在视图上,仍然不起作用,我想angular无法识别该更改。我想我必须使用一些来自