作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找如何在 AngularJS 中绑定(bind)到服务属性的最佳实践。
我已经通过多个示例了解如何绑定(bind)到使用 AngularJS 创建的服务中的属性。
下面我有两个示例,说明如何绑定(bind)到服务中的属性;他们都工作。第一个示例使用基本绑定(bind),第二个示例使用 $scope.$watch 绑定(bind)到服务属性
在绑定(bind)到服务中的属性时,这些示例中的任何一个是首选,还是有其他我不知道的选项会被推荐?
这些示例的前提是服务应该每 5 秒更新一次其属性“lastUpdated”和“calls”。更新服务属性后, View 应反射(reflect)这些更改。这两个示例都成功运行;我想知道是否有更好的方法来做到这一点。
基本绑定(bind)
以下代码可以在这里查看和运行:http://plnkr.co/edit/d3c16z
<html>
<body ng-app="ServiceNotification" >
<div ng-controller="TimerCtrl1" style="border-style:dotted">
TimerCtrl1 <br/>
Last Updated: {{timerData.lastUpdated}}<br/>
Last Updated: {{timerData.calls}}<br/>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.js"></script>
<script type="text/javascript">
var app = angular.module("ServiceNotification", []);
function TimerCtrl1($scope, Timer) {
$scope.timerData = Timer.data;
};
app.factory("Timer", function ($timeout) {
var data = { lastUpdated: new Date(), calls: 0 };
var updateTimer = function () {
data.lastUpdated = new Date();
data.calls += 1;
console.log("updateTimer: " + data.lastUpdated);
$timeout(updateTimer, 5000);
};
updateTimer();
return {
data: data
};
});
</script>
</body>
</html>
<html>
<body ng-app="ServiceNotification">
<div style="border-style:dotted" ng-controller="TimerCtrl1">
TimerCtrl1<br/>
Last Updated: {{lastUpdated}}<br/>
Last Updated: {{calls}}<br/>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.js"></script>
<script type="text/javascript">
var app = angular.module("ServiceNotification", []);
function TimerCtrl1($scope, Timer) {
$scope.$watch(function () { return Timer.data.lastUpdated; },
function (value) {
console.log("In $watch - lastUpdated:" + value);
$scope.lastUpdated = value;
}
);
$scope.$watch(function () { return Timer.data.calls; },
function (value) {
console.log("In $watch - calls:" + value);
$scope.calls = value;
}
);
};
app.factory("Timer", function ($timeout) {
var data = { lastUpdated: new Date(), calls: 0 };
var updateTimer = function () {
data.lastUpdated = new Date();
data.calls += 1;
console.log("updateTimer: " + data.lastUpdated);
$timeout(updateTimer, 5000);
};
updateTimer();
return {
data: data
};
});
</script>
</body>
</html>
最佳答案
考虑一些 第二种方法的优缺点 :
{{lastUpdated}}
而不是 {{timerData.lastUpdated}}
,这很容易成为 {{timer.lastUpdated}}
,我可能认为它更具可读性(但我们不要争论......我给这一点一个中立的评级,所以你自己决定)ng-model
您的代码变得更不干燥,因为您必须重新打包 $scope.scalar_values
在 Controller 中进行新的 REST 调用。 $scope.timerData = Timer.data;
现在开始听起来很诱人……让我们深入研究最后一点……我们在谈论什么样的模型变化?后端(服务器)上的模型?还是只在前端创建并存在的模型?无论哪种情况,本质上数据映射 API 都属于前端服务层( angular.factory 或服务)。 (请注意,您的第一个示例——我的偏好——在服务层中没有这样的 API,这很好,因为它足够简单,不需要它。)
$scope = injectable.data.scalar
的。相反,它们应该撒上
$scope = injectable.data
的,
promise.then(..)
的,和
$scope.complexClickAction = function() {..}
的
$watch
controller
中的标量值或
link
功能。这不会节省时间或使代码更具可维护性或可读性。它甚至不会使测试更容易,因为 angular 中的健壮测试通常无论如何都会测试生成的 DOM。相反,在指令中要求您的数据 API 为对象形式,并倾向于仅使用
$watch
创建者
ng-bind
.
<body ng-app="ServiceNotification">
<div style="border-style:dotted" ng-controller="TimerCtrl1">
TimerCtrl1<br/>
Bad:<br/>
Last Updated: {{lastUpdated}}<br/>
Last Updated: {{calls}}<br/>
Good:<br/>
Last Updated: {{data.lastUpdated}}<br/>
Last Updated: {{data.calls}}<br/>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.js"></script>
<script type="text/javascript">
var app = angular.module("ServiceNotification", []);
function TimerCtrl1($scope, Timer) {
$scope.data = Timer.data;
$scope.lastUpdated = Timer.data.lastUpdated;
$scope.calls = Timer.data.calls;
};
app.factory("Timer", function ($timeout) {
var data = { lastUpdated: new Date(), calls: 0 };
var updateTimer = function () {
data.lastUpdated = new Date();
data.calls += 1;
console.log("updateTimer: " + data.lastUpdated);
$timeout(updateTimer, 500);
};
updateTimer();
return {
data: data
};
});
</script>
</body>
关于AngularJS : The correct way of binding to a service properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15800454/
我是一名优秀的程序员,十分优秀!