更改值后$ scope不会刷新

时间:2016-09-04 04:24:55

标签: javascript angularjs json

我有服务模块,它读取JSON文件并返回JSON数据。 这是代码

redux-electron-ipc

我在我的指令中获取此数据并将其分配给我的$ scope变量。

angular.module('serviceModule').service('dataService',["$http",function($http){
return {
    getData:function(file){
        return $http.get('url to json file').then(function(response) {

            return response.data;              
 });                        
    }

所以我的主要问题是我有另一个控制器,它将位置的值更改为JSON值'但是当我刷新网页时,此更改并未立即反映出来然后只有那些变化才会反映出来 我已经尝试使用watcher实现但是它会不断地抛出ERROR并且我的浏览器变得没有响应。 任何人都可以帮助我在“位置到JSON值

中发生变化时立即反映变化

我的一些人问你的HTML指令。在指令中,我正在做

angular.module('xyz').directive('xyz',function(dataService){
  return {
   templateUrl:'hfhf',
   controller:'hgf',
   link:function($scope){
        console.log("Hi");

               $scope.tasks=[];
      dataService.getData('location to json file').then(function(data){
         $scope.tasks=data;
      });

在这里我使用ngDragDrop这就是为什么我添加了那些工作正常的标签。我只是迭代完成所有任务。

3 个答案:

答案 0 :(得分:2)

根据要求,我发表评论作为答案,因为它适用于OP。

  

我不确定我是否完全理解你的问题,但请看看$ broadcast / $ emit和$ on。当您的控制器进行更改时,发布带有$ broadcast或$ emit的消息,然后连接您的指令以使用$ on侦听该事件。这是一个很棒的SO链接:Working with $scope.$emit and $scope.$on

我将借用链接在这里给出一个概述:

$broadcast - 将事件向下调度到所有子范围

$emit - 通过范围层次结构向上调度事件。

所以使用的一个简单例子是:

function firstCtrl($scope)
{
    $scope.$broadcast('someEvent', [1,2,3]);
}

function secondCtrl($scope)
{
    $scope.$on('someEvent', function(event, mass) { console.log(mass); });
}

答案 1 :(得分:0)

  

我只使用dataService将数据发布到网址,但是来自不同的控制器。我不知道如何在网址发生数据更改时通知

这个问题有几种方法。一种是在服务中保留本地副本,并在本地副本上使用观察者。

app.service('dataService',function($http){
    var dataService = this;
    this.localCopy = {};
    this.getData = function(url){
        return $http.get(url).then(function(response) {
            dataService.localCopy[url] = response.data;                
            return response.data;              
        });                        
    };
    this.postData = function(url, data) {
        dataService.localCopy[url] = data;
        return $http.post(url,data).then(function (response) {
            return response.data;
        });
    };
});

该指令可以将观察者放在数据的本地副本上。

app.directive('xyz',function(dataService){
    return {
       templateUrl:'hfhf',
       controller:'hgf',
       link: function(scope){
            console.log("Hi");
            dataService.getData(url);
            scope.$watch(
                function() {return dataService.localCopy[url]},
                function (newValue) { scope.tasks = newValue;}
            );
       }
    }
});

通过观察服务中数据的本地副本,该指令将看到该服务的其他用户创建的更改。

答案 2 :(得分:-2)

试试这个:

dataService.getData('location to json file').then(function(data){
         $scope.tasks=data;
         $scope.$apply();
      });

这将强制执行摘要周期并更新所有观察者,确保范围内的更改反映在您的视图中。

This blog post explains more