为什么我的对象的属性被覆盖?

问题描述:

我在Angular中有以下代码,这是一个尝试在同一个网页上允许同一个Controller的多个实例。问题是,每次创建新实例时,它都将自身添加到实例对象,但会擦除实例对象上的其他属性(即实例)。我认为这是一个与Angular无关的简单的javascript语法问题,但我无法弄清楚。有什么建议?为什么我的对象的属性被覆盖?

angular.module('mean.root').controller('ContentA1Controller', ['$scope', '$location', 'Global', 'Data', '$timeout', '$interval', 'Clients', 'Modals', '$element', function ($scope, $location, Global, Data, $timeout, $interval, Clients, Modals, $element) { 

      // Defaults 
      $scope.instances = { A: {}, B: {}, C: {}, D: {}, E: {}, F: {} }; 

      // Methods 
      $scope.createNewInstance = function() { 
       var instance = $($element).closest('.content-container').attr('id'); 
       // Add ID to content 
       $($element).find('.content').attr("id", "contentA1instance"+instance); 
       Data.priceByDay(function(prices){ 
        // Load Chart Data 
        $scope.instances[instance].data = [1,2,3,4,5]; 
        // Log Instance Object 
        console.log($scope.instances); 

所以,当我添加一个实例给控制器,它的工作原理和我登录:

$scope.instances = { A: { data: [1,2,3,4,5] }, B: {}, C: {}, D: {}, E: {}, F: {} } 

后来,当我添加另一个实例,再次运行createNewInstance()方法时,它会记录:

$scope.instances = { A: {}, B: { data: [1,2,3,4,5] }, C: {}, D: {}, E: {}, F: {} } 
+2

也许它重新运行整个控制器? – Bergi

+0

你说得对,当然它,杰什是多么明显,现在我需要重新设计compeltely这个.. – ac360

+1

的[AngularJS服务(http://code.angularjs.org/1.2.14/docs/guide /dev_guide.services.creating_services)是保存跨越多个$ scope的数据的好地方 – Hylianpuffball

var instance = $($element).closest('.content-container').attr('id'); 
.... 
$scope.instances[instance].data = [1,2,3,4,5]; 

它选择最接近.content-container到控制器在页面绑定的元素的id。既然你说你已经使用了两次控制器,其中一个绑定更接近.content-container#A,另一个更接近.content-container#B。这看起来像代码是“按设计工作”,但你可能没有“设计你的意思”。

+0

好的,明确的解释这里发生了什么的方法。谢谢Nate。 – ac360

我建议使用为每个实例不同的控制器,并保持共享数据$ rootScope,或者更好的是使用整个页面一个位指示并在各实例进行操作,仅在一个地图项目。