Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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
Javascript AngularJS 1.5.x服务未正确绑定,并且未在控制器中更新_Javascript_Angularjs_Angularjs 1.5 - Fatal编程技术网

Javascript AngularJS 1.5.x服务未正确绑定,并且未在控制器中更新

Javascript AngularJS 1.5.x服务未正确绑定,并且未在控制器中更新,javascript,angularjs,angularjs-1.5,Javascript,Angularjs,Angularjs 1.5,由于某些原因,当我更新工厂值时,关联的视图不会更新。我绑定到服务中的一个对象,而不是一个字符串,所以我看不出我做错了什么,但实现肯定有问题。为了简洁起见,我减少了代码,并将其添加到plunker中。我以为我把服务搞砸了,但显然不是。我甚至再读一遍,以确保我所理解的是正确的 标题的值将在第一次获取,您将看到“欢迎!”在标题中,但在此之后,它将不会更新为“Up Next!” (功能(){ "严格使用",; 功能主控制器(HTMLITLEFactory){ htmlitlefactory.set(

由于某些原因,当我更新工厂值时,关联的视图不会更新。我绑定到服务中的一个对象,而不是一个字符串,所以我看不出我做错了什么,但实现肯定有问题。为了简洁起见,我减少了代码,并将其添加到plunker中。我以为我把服务搞砸了,但显然不是。我甚至再读一遍,以确保我所理解的是正确的

标题的值将在第一次获取,您将看到“欢迎!”在标题中,但在此之后,它将不会更新为“Up Next!”


(功能(){
"严格使用",;
功能主控制器(HTMLITLEFactory){
htmlitlefactory.set('Welcome!');//设置标题
//检查标题已更改
this.data=htmlitleFactory.get();
setTimeout(函数(){
//更新标题
htmlitleFactory.set('setnext!');
//标题看起来已设置,但未在视图中拾取更改
log(htmlitlefactory.get());
}, 3000);
}
主控制器。$inject=[
“HTMLITLEFactory”
];
var main={
模板:“{vm.data.title}}”,
控制器:主控制器,
controllerAs:'vm'
};
////////////////////////////
函数HTMLITLEController(HTMLITLEFactory){
var vm=这个;
//vm.title=htmlitleFactory.get().title;
vm.title=htmlitlefactory.get();
}
HTMLITLEController.$inject=[
“HTMLITLEFactory”
];
var htmlTitle={
模板:“{vm.title.title}}”,
控制器:HTMLITLEController,
controllerAs:'vm'
};
////////////////////////////
函数HtmlTitleFactory(){
var服务={
标题:“默认值”
};
功能集(标题){
//最初尝试过这个,因为绑定到对象应该可以工作
//service.title=标题;
//不起作用,所以也尝试了这个
角度扩展(服务,{
标题:标题
});
}
函数get(){
回程服务;
}
返回{
集:集,,
得到:得到
};
}
HtmlTitleFactory.$inject=[];
////////////////////////////
有棱角的
.module('应用程序',[])
.组件(“主”,主)
.component('htmlTitle',htmlTitle)
.工厂(“HTMLITLEFactory”,HTMLITLEFactory);
})();

setTimeout
是一个事件,它不允许告诉angular在angular上下文中发生了更改,因为它是在angular上下文之外运行的自定义事件。在这种情况下,digest cycle不会着火,您需要手动运行它

理想情况下,您应该使用
$timeout
,它的工作原理类似于
setTimeout
,并且在触发回调时运行摘要循环

$timeout(function() {
   HtmlTitleFactory.set('Up Next!'); // update title
   console.log(HtmlTitleFactory.get()); // title looks to be set but not picked up in view
}, 3000);

这是因为做出了AngularJS不知道的更改,所以如果我使用了setTimeout(我不会这么做),但如果我使用了setTimeout,我需要运行$digest来获取它?@mtpultz是的,您可以使用
$apply()/$digest()
,但这将是一个糟糕的模式来实现,您将再次需要添加条件以检查摘要周期不应进行
$timeout(function() {
   HtmlTitleFactory.set('Up Next!'); // update title
   console.log(HtmlTitleFactory.get()); // title looks to be set but not picked up in view
}, 3000);