DOM 当控制器变量的值改变时不被更新
DOM not being updated when the value of a controller variable changes
我有一个 AngularJS 应用依赖于本地存储中存储的数据。
在我的应用程序中,显示了一个电台列表,按最后一次点击的时间排序。当用户单击这些站点中的任何一个时,使用下面 $recentStations
服务中的 update
方法(成功)更新本地存储,并在屏幕上更新站点列表。
我的问题是,我在网站的 header 中显示了最新的电台,当用户点击一个电台时,它不会自动更新。
我该如何修改我的代码来解决这个问题?
服务
app.factory('$recentStations', ['$localStorage', function($localStorage){
var recentStations = {
local : $localStorage.$default({
recentStations: []
}),
get : function(){
return this.local.recentStations;
},
getCurrent : function(){
return this.local.recentStations[0];
},
update : function(elm){
this.local.recentStations.unshift(elm);
}
};
return recentStations;
}]);
控制器
app.controller('headerCtrl', ['$scope', '$recentStations', function($scope, $recentStations){
$scope.currentStation = $recentStations.getCurrent();
}]);
HTML
<div id="header" data-ng-controller="headerCtrl">
<div class="inner">
<h1 data-ng-if="currentStation">
<span class="orange">Tiger</span> | {{ currentStation.name }} ({{ (currentStation.code | uppercase) }})</span>
</h1>
<h1 data-ng-if="!currentStation"><span class="orange">Tiger</span> | Select a station</h1>
</div>
</div>
构建控制器时,它会向当前站点请求服务并将其存储在范围变量中。但是当你更新服务中的当前站时,范围变量仍然引用初始当前站。不是新的。因此,您需要始终从服务中获取当前站点,而不是将其缓存在范围内:
而不是
$scope.currentStation = $recentStations.getCurrent();
使用
$scope.getCurrentStation = function() {
return $recentStations.getCurrent();
}
并且在视图中,使用 getCurrentStation()
而不是 currentStation
。这样,每次视图刷新时,它都会调用服务来获取最新的电台。
或者,当当前站被修改时,在 rootscope 上广播一个事件来提醒您的控制器它应该重新加载当前站。
请注意,您不应为自己的服务命名 $xxx
。 $
前缀准确地用作框架提供的服务的命名空间,以确保框架中任何新引入的服务都不会与您的服务冲突。
我有一个 AngularJS 应用依赖于本地存储中存储的数据。
在我的应用程序中,显示了一个电台列表,按最后一次点击的时间排序。当用户单击这些站点中的任何一个时,使用下面 $recentStations
服务中的 update
方法(成功)更新本地存储,并在屏幕上更新站点列表。
我的问题是,我在网站的 header 中显示了最新的电台,当用户点击一个电台时,它不会自动更新。
我该如何修改我的代码来解决这个问题?
服务
app.factory('$recentStations', ['$localStorage', function($localStorage){
var recentStations = {
local : $localStorage.$default({
recentStations: []
}),
get : function(){
return this.local.recentStations;
},
getCurrent : function(){
return this.local.recentStations[0];
},
update : function(elm){
this.local.recentStations.unshift(elm);
}
};
return recentStations;
}]);
控制器
app.controller('headerCtrl', ['$scope', '$recentStations', function($scope, $recentStations){
$scope.currentStation = $recentStations.getCurrent();
}]);
HTML
<div id="header" data-ng-controller="headerCtrl">
<div class="inner">
<h1 data-ng-if="currentStation">
<span class="orange">Tiger</span> | {{ currentStation.name }} ({{ (currentStation.code | uppercase) }})</span>
</h1>
<h1 data-ng-if="!currentStation"><span class="orange">Tiger</span> | Select a station</h1>
</div>
</div>
构建控制器时,它会向当前站点请求服务并将其存储在范围变量中。但是当你更新服务中的当前站时,范围变量仍然引用初始当前站。不是新的。因此,您需要始终从服务中获取当前站点,而不是将其缓存在范围内:
而不是
$scope.currentStation = $recentStations.getCurrent();
使用
$scope.getCurrentStation = function() {
return $recentStations.getCurrent();
}
并且在视图中,使用 getCurrentStation()
而不是 currentStation
。这样,每次视图刷新时,它都会调用服务来获取最新的电台。
或者,当当前站被修改时,在 rootscope 上广播一个事件来提醒您的控制器它应该重新加载当前站。
请注意,您不应为自己的服务命名 $xxx
。 $
前缀准确地用作框架提供的服务的命名空间,以确保框架中任何新引入的服务都不会与您的服务冲突。