2014-05-06 54 views
8

枚舉對象的角度特定屬性$$hashKey可用於很多事情。

例如DOM-targeting;

<div ng-repeat="obj in objects"> 
    <label for="field-{{obj.$$hashKey}}"> 
     Label 
    </label> 
    <input type="text" id="field-{{obj.$$hashKey}}" /> 
</div> 

在我遇到現在$$ hashKey道具還沒有一個對象我想訪問它,即使它被重複角上設置了一些奇怪的情況。 初始化對象時有沒有辦法自己設置這個屬性?

編輯:我的猜測是存在某種形式的執行順序問題,我在Angular尚未處理重複時訪問屬性。 我深深地注視着一個物體,在那個物體內是一個有重複的物體的數組。這也是我需要訪問$$hashKey屬性的那些對象之一。

簡單的例子;

var MyController = function($scope, Obj) 
{ 
    $scope.obj = { 
     list: [obj, obj, obj, obj] 
    }; 

    $scope.$watch("obj", function() 
    { 
     var lastObj = $scope.obj.list[$scope.obj.list.length - 1]; 
     console.log(lastObj.$$hashKey); // Undefined? 
    }, true); 

    $scope.addObj = function() 
    { 
     $scope.obj.list.push(new Obj()); 
    }; 
}; 

EDIT2:的jsfiddle http://jsfiddle.net/2sbWp/2/

+0

請創建plunker或的jsfiddle,這是難以複製的問題,你遇到 – SoluableNonagon

+0

我的問題非常簡單。 即使對我來說,複製問題也需要時間,因爲我必須去掉許多公司特定的代碼,而這些代碼我無法公開顯示。 – Rasmus

+0

我同意這很簡單,我不要求您發佈公司代碼,只是爲了使用虛擬代碼複製問題。 – SoluableNonagon

回答

5

使用$超時無延遲值推遲到$$ hashKey屬性可用:

$timeout(function(){console.log(lastObj.$$hashKey)}); 

A working fork of your Fiddle

+0

這似乎是一種魅力!我不再工作,所以我不能確認它實際上工作,但我認爲沒有理由不這樣做。 雖然我會在Angulars issue-tracker中爲此創建一個問題。我不知道這是否按預期工作,或者如果它是一個錯誤,我不知道在後一種情況下根深蒂固。 – Rasmus

+1

可能值得探索。我認爲儘管你會發現它是預期的行爲,因爲你需要給Angular一個機會在訪問它們之前用$$ hashKey來裝飾你的對象。如果你發現其他情況,這裏值得更新。 –

-1

我創建了一個基於你的代碼的虛擬實例,在這裏看到:http://plnkr.co/edit/9PNc6bcy1TO4Zaeyuvwq?p=preview

var app = angular.module('gssApp', []); 

app.controller('gssAppController', [ '$scope', '$http', function ($scope, $http) 
{ 
    var obj = {'hash': 'test'}; 
    $scope.newObject = {'hash': 'test'}; 
    $scope.model = null; 

    $scope.objects = []; 

    $scope.addObj = function(){ 
    if($scope.model !== null && $scope.model !== undefined){ 
     $scope.objects.push({'hash': $scope.model}); 
     $scope.model = ''; 
     angular.forEach($scope.objects, function(key, value){ 
     console.log(value, key); 
     }); 
    } 
    }; 

}]); 

HTML

<body ng-app="gssApp" ng-controller="gssAppController"> 
    <div ng-repeat="obj in objects"> 
     <label for="field-{{obj.$$hashKey}}" ng-click="alert(obj.$$hashKey)"> 
     Label 
     </label> 
     <input type="text" id="field-{{obj.$$hashKey}}" /> 
    </div> 
    <input type="text" placeholder='add new key' ng-model="model"> 
    <button ng-click="addObj();">Submit</button> 
</body> 

希望這對帶來了曙光$$ hashkey

+0

我沒有收到沒有設置$$ hashkey的任何實例 – SoluableNonagon

+0

好像這個問題更多的是與他的$ watch和getHashKey()有關的東西,這在他的示例代碼中沒有充分表達,因此很難幫助。 –

+0

我的示例中的'getHashKey'函數只是一個虛擬。假設它讀取'$$ hashKey'屬性。 您的代碼並未複製我的方案,它也不是我的實際問題的答案或解決方案。 我真的不知道如何簡化這個場景。它很簡單。 – Rasmus