gpt4 book ai didi

javascript - 在自己的指令中包装 Angular.js ui-bootstrap 或 ui-select 指令

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

我正在创建一个大型 Angular.JS 应用程序,它使用一些第三方模块,如 ui-select 和 ui-bootstrap。为了避免重复我自己,我开始创建指令,这些指令包装了例如 ui-select 代码和检索/搜索数据的逻辑。

目标:目标是创建一个可以在模板中使用的指令,而无需在 Controller 中复制代码:

<tq-car-select ng-model="model.car"></tq-car-select>

我尽量避免的事情:

<select ng-options="car.id as car.name for car in cars"></select>

并在所有使用选择的 Controller 中复制以下代码:

$scope.cars = carResource.query();
$scope.$watch('model'), function (newValue, oldValue) {
$scope.cars = carResource.query({model: $scope.model});
});

我为那种选择字段创建了指令。

使用 ui-select 的实际示例:

tq-lead-select.html:

<ui-select ng-model="$parent.tqModel" style="display: block">
<ui-select-match placeholder="tippen ...">{{$select.selected.bezeichnung}}</ui-select-match>
<ui-select-choices repeat="lead in leads | filter:{bezeichnung: $select.search}">
<div ng-bind-html="lead.bezeichnung | highlight: $select.search"></div>
</ui-select-choices>
</ui-select>

tqLeadSelect.ts( typescript ):

export function tqLeadSelect(tqLeadSelects): ng.IDirective {

var dir: ng.IDirective = {};

dir.scope = {
tqModel: '=',
tqCompany: '='
};

dir.restrict = 'E';
dir.templateUrl = '/js/templates/leadApp/tq-lead-select.html';
dir.replace = false;

dir.controller = function ($scope: any) {
if (tqLeadSelects != null && $scope.tqCompany != null) {
$scope.leads = tqLeadSelects.getLeadsFromFirma({ id: $scope.tqCompany });
}

$scope.$watch('tqCompany', (newValue, oldValue) => {
if (newValue === oldValue) return;

$scope.leads = tqLeadSelects.getLeadsFromFirma({ id: $scope.tqCompany });
}, true);
}

return dir;
}

tqLeadSelect.$inject = ['tqLeadSelects'];

问题:

  • 我需要隔离范围,因为有些 View 使用一个字段的多个实例。
  • 我正在使用由 ui-select 指令的 ngModel 设置的隔离范围变量 tqModel
  • 我想使用 ng-required 而不在 tqLeadSelect 指令上创建 tq-required 范围变量

问题:

  • 我做得对吗?有没有更好的方法来实现我的目标?
  • 您如何使用用于检索数据和附加功能的支持 Controller 代码来定义选择字段?

最佳答案

一个解决方案是添加一个扩展现有指令的指令。

我用一个例子创建了一个 Plunker:http://plnkr.co/edit/9IZ0aW?p=preview

以下代码:

HTML:

<ui-select ng-model="address.selected" theme="bootstrap" ng-disabled="disabled" reset-search-input="false" style="width: 300px;">
<ui-select-match placeholder="Enter an address...">{{$select.selected.formatted_address}}</ui-select-match>
<ui-select-choices repeat="address in addresses track by $index" refresh="refreshAddresses($select.search)" refresh-delay="0">
<div ng-bind-html="address.formatted_address | highlight: $select.search"></div>
</ui-select-choices>
</ui-select>

Controller :

$scope.address = {};
$scope.refreshAddresses = function(address) {
var params = {
address: address,
sensor: false
};
return $http.get(
'http://maps.googleapis.com/maps/api/geocode/json', {
params: params
}
).then(function(response) {
$scope.addresses = response.data.results
});
};

可以通过使用配置指令来简化:

<ui-select ng-model="adress.selected" tq-select></ui-select>

Controller 现在是空的!

指令:

app.directive("tqSelect", function($http) {

return {
restrict: "A", // Attribute
require: ["uiSelect", "ngModel"],

compile: function compile(tElement, tAttrs, transclude) {

// Add the inner content to the element
tElement.append('<ui-select-match placeholder="Enter an address...">{{$select.selected.formatted_address}}</ui-select-match>\
<ui-select-choices repeat="address in addresses track by $index" refresh="refreshAddresses($select.search)" refresh-delay="0">\
<div ng-bind-html="address.formatted_address | highlight: $select.search"></div>\
</ui-select-choices>');

return {
pre: function preLink(scope, iElement, iAttrs, controller) {},
post: function postLink(scope, iElement, iAttrs, controller) {

// logic from controller
scope.address = {};
scope.refreshAddresses = function(address) {
var params = {
address: address,
sensor: false
};
return $http.get(
'http://maps.googleapis.com/maps/api/geocode/json', {
params: params
}
).then(function(response) {
scope.addresses = response.data.results
});
};
}
}
}
}
});

指令是真正棘手的部分。我在编译函数中使用了一个不平凡的逻辑。首先,我为 ui-select 指令添加了所需的标记。

然后在后链接函数中,我添加了通常在 Controller 中(或在 link() 函数中)的逻辑。

关于javascript - 在自己的指令中包装 Angular.js ui-bootstrap 或 ui-select 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27066175/

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