gpt4 book ai didi

javascript - 带有回调的一页上的多个自定义指令

转载 作者:行者123 更新时间:2023-11-29 10:42:52 24 4
gpt4 key购买 nike

我创建了一个自定义指令(在 SO 的帮助下)。这是一个完整的页面日期选择器,当用户选择日期时,它使用 ngModel 来设置日期。同时它调用一个回调函数,该函数是在将指令添加到页面时设置的。问题是,如果我在页面上放置 2 个日期选择器,那么它总是会尝试调用第二个日期选择器的回调。

这是 HTML...

<fp-date-picker ng-model="dateOne" on-select="dateSelectedOne()"></fp-date-picker>

<fp-date-picker ng-model="dateTwo" on-select="dateSelectedTwo()"></fp-date-picker>

这是我的指令,为简洁起见删除了大部分指令

angular.module('directives').directive('fpDatePicker', ['$parse', function ($parse) {

return {

restrict: 'EA',
require: 'ngModel',
templateUrl: '/templates/fpDatePicker.tpl.html',

link: function($scope, $element, $attrs, ngModel){

// A callback executed when a date is selected
var onSelectCallback = $parse($attrs.onSelect);


// Set current month
$scope.selectedDate = moment();



// Set date when one is clicked
$scope.selectDate = function(day){

var selectedDay = day.number;
var selectedMonth = $scope.currentMonth.format('MM');
var selectedYear = $scope.currentMonth.format('YYYY');

$scope.selectedDate = moment(selectedYear + '-' + selectedMonth + '-' + selectedDay, 'YYYY-MM-DD');

// Update the model
ngModel.$setViewValue($scope.selectedDate);


// Call the on-select callback
onSelectCallback($scope);

};


}


};

}]);

为了以防万一,这是我的指令模板....

<div class="fpDatePicker-controls">
<a href="#" ng-click="previousMonth()">&lt;</a>
<a href="#" ng-click="nextMonth()">&gt;</a>
</div>
<div class="fpDatePicker-month">
<a class="fpDatePicker-day"
ng-repeat="day in currentMonth.days"
ng-click="selectDate(day)"
>
{{day.number}}
</a>
</div>

我认为它总是使用页面上指令的最后一个实例的回调的问题可能与链接函数中的变量对该指令的所有实例都是全局变量有关,或者 $attrs 不是指令的当前实例的 attrs,但我使用 console.log() 来显示 $attrs,并且在每种情况下都不同。

我也想知道它是否与使范围隔离有关,但尽管回调函数位于范围内,但属性中的表达式不是范围的一部分,它是传入的属性。

非常困惑,非常感谢任何帮助。

更新:创建了一个 Plunkr

http://plnkr.co/edit/nU27Wjpu3UYCR9q6DnLw?p=preview

最佳答案

您的问题来自于您的指令不依赖于独立作用域这一事实。因此,两个指令实例共享相同的范围。创建第二个指令时,它会覆盖所有作用域变量。

您可以在文档中阅读有关隔离范围的更多信息:https://docs.angularjs.org/guide/directive .

这里有一个 plunkr 展示了如何使用隔离作用域: http://plnkr.co/edit/U64sbukqfFW0NQmvIC1a

我已经更新了您的标记,使其语法与 Controller 兼容:

<body ng-controller="MainCtrl as main">
{{main.dateOne}}
<fp-date-picker ng-model="main.dateOne" on-select="main.dateSelectedOne()"></fp-date-picker>

<br />
<br />
<br />

{{main.dateTwo}}
<fp-date-picker ng-model="main.dateTwo" on-select="main.dateSelectedTwo()"></fp-date-picker>

</body>

指令定义中的主要变化是在指令定义对象中使用 scope 属性来拥有一个独立的范围:

.directive('fpDatePicker', function() {

return {
scope: {
select: '&onSelect'
},

restrict: 'EA',
require: 'ngModel',
templateUrl: 'datepicker.html',

link: function($scope, $element, $attrs, ngModel) { ... }
};
})

请注意您的代码在日期选择方面仍然存在问题。单击一天将选择前一天的日期。我没有解决这个问题。如果您需要帮助,请告诉我

关于javascript - 带有回调的一页上的多个自定义指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25388249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com