我是否需要创建getCurrent
来保持绑定(如果我的视图中有{{current.status}}
)?或current: current
是否足够?
如果Id status
,我是否会将绑定失去$scope.status = services.status
。意义status
如果更改,则不会在视图中更新。
是否会保留与someValue
的绑定?这意味着如果我在$scope.someValue = services.someValue
function someService() {
var current = {
status: ''
};
var someValue = 'hello';
//////////
var service = {
current: current,
getCurrent: getCurrent,
status: current.status,
someValue: someValue
};
return service;
//////////
function getCurrent() {
return current;
}
}
答案 0 :(得分:1)
好的,正如您使用JavaScript进行编程一样,您并没有像在Java中那样使用getter / setter。
所有角度服务都是单身,因此您可以轻松共享部分数据。此外,通过创建工厂,您可以返回对象,并希望您想要内部,例如方法,将调用。您可以使用工厂模式进行连接。
在您的情况下,您可以将服务实例保存到当前的$scope
。
修改强>
在您的工厂中,您应该返回current
个对象。然后,您应该在视图中使用它来检索当前状态。因此,您将获得对象,而不仅仅是固定值,因此会更新。
<强>控制器强>
(function(){
function Controller($scope, Service) {
//Register the Service instance into our scope
$scope.service = Service;
//Retrieve current object with status property
$scope.working = Service.current;
//Retrieve VALUE of current object
$scope.not_working = Service.status;
$scope.changeStatus = function() {
Service.changeStatus('another status');
}
}
angular
.module('app', [])
.controller('ctrl', Controller);
})();
<强>服务强>
(function(){
function Service($timeout) {
var current = {
status: 'off'
};
var someValue = 'hello';
$timeout(function() {
//Update service status
current.status = 'on';
}, 500);
//////////
var service = {
//Return the current object
current: current,
//Just set the VALUE of current.status
status: current.status,
getCurrent: getCurrent,
someValue: someValue,
changeStatus: changeStatus
};
return service;
function getCurrent() {
return current;
}
function changeStatus(status) {
alert("status changed");
//Modifying status property of current object
current.status = status;
}
}
angular
.module('app')
.factory('Service', Service);
})();
<强> HTML 强>
<body ng-app='app' ng-controller='ctrl'>
Status : {{working.status}}<br>
Status not updating : {{not_working}}<br>
SomeValue : {{service.someValue}}
<br>
<button ng-click="changeStatus()">go</button>
</body>
您可以看到Working Plunker
答案 1 :(得分:1)
2&amp; 3.不,因为您要将范围变量设置为服务的属性($ scope.status = service.status),并且这些属性是字符串,所以不会保留绑定。但是,如果您将整个服务对象分配为范围变量并在绑定中使用点表示法,那么它们将是因为您将更新其引用被注入控制器(服务)的对象。需要注意的重要事项是为了理解为什么你的方法不起作用,但另一种方法是理解
这是您的代码可以使它工作的样子:
use strict;
use warnings;
use URI;
use URI::QueryParam;
my $url = URI->new('http://test.com/index.php?id=123&test=1&l=1');
for my $param ( $url->query_param ) {
my $new_url = $url->clone;
$new_url->query_param($param => $url->query_param($param) . 'a');
print $new_url, "\n";
}
以下是样本plunker:http://plnkr.co/edit/n2P07mjwnMVHCl4l7SAj?p=preview。请注意,它有两个示例,第一个显示您的方法,第二个显示对象方法。
编辑 - BIG CAVEAT:
需要注意的一个重要注意事项是,在您的服务中,如果http://test.com/index.php?id=123a&test=1&l=1
http://test.com/index.php?id=123&test=1a&l=1
http://test.com/index.php?id=123&test=1&l=1a
或//service
.factory('service', function() {
var current = {
status: 'theStatus'
};
var someValue = 'hello';
var service = {
current: current,
status: current.status,
someValue: someValue
};
return service;
})
// controller
.controller('theCtrl', ['$scope', 'service', function($scope, service) {
$scope.serviceData = service;
}])
// view
<p>{{serviceData.current}}</p>
<p>{{serviceData.status}}</p>
<p>{{serviceData.someValue }}</p>
变量发生更改,您的视图将不会更新。因为我们正在返回服务对象,所以更改将反映在服务对象的someValue
,current
和someValue
属性中,但这些属性不会导致原始current
和{{1变量也同步。
答案 2 :(得分:0)
Angular将跟踪其范围内的变化及其执行脏检查。因此,当您的Angular应用程序中发生事件并调用$ apply或$ digest时,Angular将遍历所有$ watch值并相应地更新任何绑定值。
如果没有较新的controllerAs语法,您可能希望将任何要绑定的值放在$ scope对象上。然后,在Angular应用程序中触发的任何事件都将自动触发您的更新。
这是一个简单的演示绑定$ scope.status.value到三个DOM引用: http://codepen.io/anon/pen/KdKrqe
直接回答您的问题:
不,由于Angular脏检查,您不需要为绑定值创建getter / setter。但是,目前:目前还不够。这将重新分配Angular之外的值到其$ scope,并且根据Object类型,这将由值或引用分配。任何&#39;连接&#39;按值分配时,原始值将丢失(数字,字符串,布尔......)
是的,如果按值分配service.service,您将失去绑定,即您无法更新services.status以更新$ scope.status的值。如果您将其更改为:$scope.services = services;
那么$ scope.services.status将被绑定。
如果您使用了上述建议,则任何更改都会反映在您的原始对象中:$scope.services = services;
然后,对服务进行任何更改。将反映在您的原始对象中。
我认为这里的两个要点是理解JS中的值/引用赋值以及Angular如何通过脏检查实现绑定值。