我为以下小部件属性创建了一个自定义指令:
<div widget></div>
基本上,该指令只是创建一些模板代码并将 html 放在小部件标签中。这是指令:
skdApp.directive("widget", function() {
return {
restrict: 'A',
template: htmlTemplate,
link: function($scope, element, attri) {
/*
* setup event handler and twitter bootstrap components here
*/
}
}
htmlTemplate 是基本的 html 代码,它也使用自定义指令(例如<seal>
标签):
var htmlTemplate = '<div ng-controller="OfferCtrl">' +
'<div class="container">' +
<seal></seal>' +
'...'+
'</div>' +
'</div>';
在我的控制器中,我首先请求在 <div widget> 中显示一些数据。我有一个“提供”服务,它封装了从服务器请求数据的所有逻辑。我使用的方法称为 Offer.query()。
skdApp.controller('OfferCtrl', function OfferCtrl ($scope, Offer) {
var o = Offer.query({id: 1}, function (response) {
$scope.offer = response;
});
});
在响应处理程序中,我将结果绑定到范围。我现在面临的问题是指令也请求数据,但这个请求取决于从 Offer.query() 接收到的数据。即来自 Offer.query() 的响应返回一个 ID(我们称之为 myID),这是 seal 指令请求更多数据所必需的。因此,我只是将我所有的逻辑都放在了回调 Offer.query 回调函数中。这似乎不是最好的方法。
所以我想把这部分移到<seal>
指令的链接函数中:
skdApp.directive("seal", function() {
var sealHTML = '<div>{{offer.data.foobar}}</div>';
return {
restrict: 'E',
template: sealHTML,
link: function($scope, element, attrs) {
$scope.$watch('offer.myId', function (newValue, oldValue) {
if (typeof newValue !== "undefined") {
/* request more data with myId
* and bind the result to offer.data
*/
}
});
}
});
这种方法是“角度”兼容的还是有其他更好的方法(在结构方面)可以在角度上做到这一点?