2015-11-23 11 views
0

這是我的控制器(home.js):AngularJS結合兩個變量在一起,沒有被告知這樣做

angular.module("HomeApp", ["BaseApp"]) 
    .controller("MainCtrl", ["$http", "$window", "BaseService", function($http, $window, BaseService) { 

     var self = this; 

     self.posts = BaseService.posts; 

     BaseService.fetch.postsY(function() { 
      self.posts = BaseService.posts; 
     }); 

     self.like = function(id, postType) { 
      BaseService.like(id, postType, function() { 
       console.log(self.posts); 
      }); 
     }; 
    }]); 

這是BaseService(base.js):

angular.module("BaseApp", []) 
    .factory("BaseService", ["$http", "$window", function($http, $window) { 
     var self = this; 
     self.posts = {}; 
     self.cerrorMessages = []; 

     self.fetch = { 
      postsY: function(callback) { 
       $http.get('/postsY/') 
       .then(function(response) { 
        self.posts = response.data; 
        callback(); 
       }, function(response) { 
        // Do something with the error. 
       }); 
      } 
     }; 

     self.like = function(id, postType, callback) { 
      $http.post("/" + postType + "/" + id + "/like/") 
      .then(function(response) { 
       angular.forEach(self.posts, function(post, index, obj) { 
        if (post.id == id) { 
         post.usersVoted.push('voted'); 
         post.voted=true; 
        }; 
       callback(); 
       }); 
      }, function(response) { 
       // Do something with the error. 
      }); 
     }; 

     return self; 
    }]); 

當我加載home.html(它加載home.js),帖子加載成功(因爲在BaseService.fetch.postsY()的回調中,我在self.posts = BaseService.posts之後取回並更改BaseService.posts。奇怪的是,after我喜歡一個帖子(它調用self.likeself.posts就會自動更新home.html,即使沒有我在回調做self.posts = BaseService.postsself.like(當我在回調self.likehome.html登錄self.posts,我可以看到post.voted=true)。爲什麼AngularJS自動更新self.postshome.html沒有我做self.posts = BaseService.posts回調self.like

根據這個職位的答案被@AntonioLaguna:AngularJS updates variable in a different file without being instructed to do so

是監守我綁定self.postsBaseService.posts當我做BaseService.fetch.postsY(),但是,如果我改變BaseService.fetch.postsY()這樣:

 BaseService.fetch.postsY(function() { 
      // Do nothing in the callback. 
     }); 

那麼我的控制器上的self.posts即使在獲取帖子後仍保持爲空(即使我在我的控制器上綁定了self.posts之前的行爲:

self.posts = BaseService.posts; 

隨着中說,如何來叫我self.like()控制器上自動更新self.posts即使調用BaseService.fetch.postsY()一個空的回調函數不(考慮到我已經綁定self.postsBaseService.posts在我的控制器的開始)?

回答

1

BaseService.posts的情況下,會首先將其分配給一個空對象,然後將其分配給一個完全不同的對象(response.data),這大概是一個陣列,在postsY功能。控制器仍然會引用空對象,並且不知道該對象已被服務替換爲數組。

self.like()的情況下,該函數僅通過posts現有數組迭代和修改屬性的對象的。如果控制器正確指向對象數組,那麼由於數組本身並未被移除和替換,控制器將指向內存中數組中所有對象的同一實例,並且對這些對象屬性的更改將會被反映。

+0

嗯,有沒有什麼辦法可以在成功調用BaseService.fetch.postsY()後使AngularJS更新'BaseService.posts'(而不是通過執行self.posts = response.data來將它分配給一個新對象')? – user2719875

+1

你可能嘗試初始化'self.posts'作爲數組'']'而不是對象'{}';除此之外,您可以嘗試遍歷'response.data'並將服務器對象推送到已建立的數組中,但如果您多次獲取相同數據,這會變得很奇怪...... – Claies

+0

我嘗試初始化「self」。通過在我的BaseService中執行'self.posts = [];''作爲數組'''作爲數組',但是這並不能解決問題。而且,是的,我可以看到如何將服務器對象推入陣列可能會導致長期的問題。我想我會繼續在調用控制器函數的回調函數中執行self.posts = BaseService.posts;'在每次獲取帖子的服務器調用之後。謝謝您的幫助! – user2719875

相關問題