0

我在一個較大的項目上遇到了這個問題,並且提出了最簡單的示例。如果數據發生變化,指令中的ng-repeat不會更新

我有一個控制器,它有一些數據。這些數據被輸入到指令中,並且應該使用本地的ng-repeat來顯示。但是,當指令控制器運行時,它尚未分析角度變量,因此不會呈現重複。

如何讓它工作,以便重複使用需要預解析的外部變量?

這是一個小提琴。請確保您有打開控制檯,就說明它是未定義功能運行時,但規定在1秒鐘之後:http://jsfiddle.net/paulocoelho/xqLAs/2/

這裏我JS:

var module = angular.module('testApp', []) 
    .directive('test', function() { 
    return { 
     restrict: 'E', 
     template: '<p ng-repeat="x in sl">{{x.val}}</p>', // this wont work :(
     scope: { 
      sl: '@sl' 
     }, 
     link: function ($scope, $element, $attrs) { 
      console.log($attrs.sl);  // this will return undefined 
      setTimeout(function(){ 
       console.log($attrs.sl); // this will return the correct list 
      },1000); 
     } 
    }; 
}); 

function sweetCtrl($scope){ 
    $scope.someList = 
    [ 
     {"val":"a"}, 
     {"val":"b"}, 
     {"val":"c"}, 
     {"val":"d"}, 
     {"val":"e"}, 
     {"val":"f"} 
    ]; 
} 

這裏是我的DOM

<div ng-app="testApp" ng-controller="sweetCtrl"> 
    <p>raw list: {{someList}}</p> 
    <p>repeat list:</p> 
    <test sl="{{someList}}"></test> 
</div> 

編輯: 我的以前的代碼有一個錯誤,其中inputdata應該讀取sl。

了溶液的小提琴是在這裏:http://jsfiddle.net/paulocoelho/xqLAs/3/

回答

2

當您使用「@」,結果始終是一個字符串。如果您將模板更改爲顯示{{x}}而不是{{x.val}},您會看到我的意思。

傳遞對象到您的分離範圍,使用「=」:

<test sl="someList"></test> 

template: '<p ng-repeat="x in sl">{{x.val}}</p>', // this will work :) 
scope: { 
    sl: '=' 
}, 

而且,我(剛纔)在other question,當「@」時,你需要使用$解釋attrs。$ observe或$ scope。$ watch()異步獲取值(這將是一個字符串)。使用'='時,您不必使用$ observe或$ watch。

+0

是的,就是這樣。整個@,=和東西讓我感到困惑。謝謝你:)我會用新的小提琴更新我的代碼 – PCoelho 2013-03-01 22:55:40

相關問題