2015-11-01 46 views
1

我是新來的角度和使用我的自定義指令ng-repeat有問題。我想顯示一些我從休息界面得到的帖子,然後在指令中使用它們的_id屬性用於其他目的。但是,事實證明,當從函數內部使用(下面的示例中的測試)時,該屬性始終是最後顯示的帖子中的一個。當試圖直接在viewmodel上顯示id時,它顯示正確的。希望這是有道理的。任何幫助,將不勝感激。ng-repeat覆蓋屬性的功能,但不在視圖模型

//directive.js 

angular.module('app').directive('gnPost', myGnPost); 

function myGnPost() { 
    return { 
     restrict: 'E', 
     controller: 'postCtrl', 
     controllerAs: 'postCtrl', 
     bindToController: { 
      post: '=' 
     }, 
     scope: {}, 
     templateUrl: 'template.html' 
    }; 
}; 

//controller.js 

angular.module('app').controller('postCtrl', myPostCtrl); 

function myPostCtrl(postRestService) { 
    vm = this; 
    vm.test = function() { 
     return vm.post._id; 
    }; 
}; 

// template.html 

<p>{{postCtrl.post._id}}</p> 
//displays the right id 

<p>{{postCtrl.test()}}</p> 
//displays the id of the last element of ng-repeat 

//parent page.html 

<gn-post ng-repeat="singlePost in posts.postList" post="singlePost"></gn-post> 

回答

0

在你的控制器,你有下面這行:

vm = this; 

它應該是:

var vm = this; 

通過省略var,對全球範圍內創造了一個vm變量而不是每個控制器實例的本地一個。作爲每次迭代時調用vm.test的結果,它總是指向在最後一個控制器上定義的函數。

Fiddle - 嘗試包括/省略varpostCtrl

它使用strict mode在Javascript中,以防止這個問題和其他好的做法。在嚴格模式下,不可能無意中創建全局變量,因爲這樣做會拋出錯誤,您會立即看到問題。你只需要在你的文件或功能的開始添加這一行:

"use strict"; 
+1

謝謝,這有助於。沒有注意到缺失的變種。 – Rakem