为什么我的对象的属性被覆盖?
问题描述:
我在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: {} }
答
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,或者更好的是使用整个页面一个位指示并在各实例进行操作,仅在一个地图项目。
也许它重新运行整个控制器? – Bergi
你说得对,当然它,杰什是多么明显,现在我需要重新设计compeltely这个.. – ac360
的[AngularJS服务(http://code.angularjs.org/1.2.14/docs/guide /dev_guide.services.creating_services)是保存跨越多个$ scope的数据的好地方 – Hylianpuffball