cari

Rumah  >  Soal Jawab  >  teks badan

angular.js - angularjs在directive中使用函数的问题

我自己写了一个directive,如下:

html

<myDirective source="listOne()"</myDirective>
<myDirective source="listTwo()"</myDirective>

controller

...
$scope.listOne = function(){
    //返回一个promise
};
$scope.listTwo = function(){
    //返回另一个promise
};
...

directive

angular.module('myApp')
    .directive('myDirective', function() {
        function DataList(sourceFn) {
            var debounceId;
            self.list = [];
            self.load = function(){
                $timeout.cancel(debounceId);
                debounceId = $timeout(function() {
                    var promise = sourceFn();
                    promise.then(function(data) {
                        self.list = data;
                    });
                },0,false);
            };
            return self;
        }

        return {
            restrict: 'E',
            replace: true,
            scope: {
                source: '&'
            },
            link: function(scope, element, attr) {
                ...
                var data = new DataList(scope.source);
                ...
                scope.dataset = data.list;
                ...
            },
            template: '\
            ...\
            <li ng-repeat="d in dataset">{{d}}</li>\
            ...\'
        };
    }

那么问题来了,预期的是两个source会返回不同的两组数据,但是实际情况是两个列表显示的数据相同,而且是第二个函数listTwo()返回的数据,也就是如果我把listOne()和listTwo(),调换位置,那么返回的就是listOne()的数据。
难道是在

var data = new DataList(scope.source);
...
scope.dataset = data.list;

第二次new的时候把第一次的数据替换了?
但是scope:{source: '&'}不是会为directive生成一个自己的scope吗?
想好好学习下directive,先谢过各位

巴扎黑巴扎黑2744 hari yang lalu494

membalas semua(1)saya akan balas

  • PHP中文网

    PHP中文网2017-05-15 16:52:57

    Ini adalah masalah dengan DataList anda Perkara yang anda pulangkan ialah rujukan sendiri, yang kelihatan seperti tetingkap, jadi senarai yang sepadan ialah pembolehubah global, jadi tidak kira berapa kali anda menetapkan nilai, hanya yang terakhir akan berkuat kuasa.

    balas
    0
  • Batalbalas