0

factory在我的网络应用程序中使用 a 。在factory里面有一个对象mapLayers。在我的controller我将这个factory.mapLayers对象分配给范围上的一个变量$scope.mapLayers,并且我正在使用ngRepeat它。

问题是发生的更改factory.mapLayers不会影响$scope.mapLayers,因此DOM不会显示新的更改。我怎样才能$watch或绑定我$factory.mapLayersfactory.mapLayers

地图服务.js:

...
factory.mapLayers = [];
...
return factory;

主控制器.js:

...
$scope.mapLayers = MapService.mapLayers;
...

主.html:

...
<div ng-repeat="layer in mapLayers">
    ...
</div>
4

2 回答 2

3

您必须在变量上注册一个观察者。把它放到你的控制器中:

$scope.$watchCollection(
    function () {
        return MapService.mapLayers;
    }, function (newVal, oldVal, scope) {
        // the `scope` parameter refers to the current scope
        scope.mapLayers = MapService.mapLayers 
    }
)

第一个参数$watchCollection()是一个函数,它返回一个要监视的值(也可以是一个被评估为 Angular 表达式的字符串),第二个参数是一个回调,当检测到更改时调用。

值得一提的是,这$watch()可能不起作用(取决于您更改数组的方式),因为它只会检查数组引用是否已更改 - 例如,如果您分配MapService.mapLayers给新的 Array 对象,则会发生后者。

$watchCollection另一方面,它也会观察数组内容的变化,即它会检测像添加或删除项目这样的变化。如需更详细的解释,您可能还想查看 Ben Nadel关于两者之间差异的精彩博文。

于 2015-08-13T06:53:56.893 回答
0

您应该$watch在控制器中使用服务变量。

主控制器.js:

$scope.$watch(function() { return MapService.mapLayers },function() {
    $scope.mapLayers = MapService.mapLayers 
})
于 2015-08-13T06:39:50.730 回答