angular 自定义属性指令应替换为另一个指令
angular custom attribute directive should be replaced by another directive
我正在尝试为类似 src 的属性实现自定义属性指令,它应该表示目录的相对路径。
目录路径在全局变量中(例如 mydir)。
该属性应替换为结合了目录路径的 ng-src。
我想这样使用它:
<md-icon my-src="cake.svg"></md-icon>
<md-icon my-src="{{ anExpression }}"></md-icon>
<md-icon my-src="{{::onTimeBinding}}"></md-icon>
我也想支持这个,不仅仅是为了 angulat material 使用。
感谢您的帮助!
编辑:
对不起,我没有很好地解释自己。我想支持在各种元素中使用 mySrc 指令。它应该替换为 ng-src 与基本目录。我创建了一个 plunkr 但它不起作用。
到目前为止,代码如下所示:
app.directive("mySrc", function() {
return {
restrict: "A",
compile: function(element, attrs) {
return {
pre: function(scope, element, attributes) {
var baseUrl = 'http://dummyimage.com/';
attributes.$set("ng-src", baseUrl + attributes.mySrc);
}
}
}
}
});
使用示例:
<img my-src="100" />
<img my-src="{{ expr }}" />
<img my-src="{{:: oneTimeExpr }}" />
支持最后两个选项对我们来说也很重要。
您可以在指令实现中执行所需的操作:
var app = angular.module('app', []);
app.directive('mySrc', function ($compile) {
return {
restrict: 'A',
replace: true,
scope: true,
template: '<li><img ng-src="{{ image }}" /></li>',
link: function (scope, element, attrs) {
var baseUrl = 'http://dummyimage.com/';
console.log(attrs);
scope.image = baseUrl + attrs.mySrc;
}
};
});
这是工作plunkr
您的指令确实有效,但您的方法略有偏差。您不想将 my-src
更改为 ng-src
,因为 ng-src
是一个执行与您尝试执行的操作类似的指令。您 实际上 想要做的是将 my-src
更改为 src
,以便浏览器实际呈现标签。
换句话说,attributes.$set("src", baseUrl + attributes.mySrc);
做你想做的事。但是,它不是动态的。
摘自 source for ng-src
,您可以使用 $observe
来监控您的属性变化。
pre: function(scope, element, attributes) {
var baseUrl = 'http://dummyimage.com/';
attributes.$observe("mySrc", function(value) {
attributes.$set("src", baseUrl + attributes.mySrc);
})
}
<button ng-click="expr = '200'">Test dynamic</button>
我刚刚添加了一个快速按钮来测试动态变化。对于 $observe
,只要 mySrc
属性发生变化,src
属性就会更新为新的 URL。
我正在尝试为类似 src 的属性实现自定义属性指令,它应该表示目录的相对路径。
目录路径在全局变量中(例如 mydir)。
该属性应替换为结合了目录路径的 ng-src。
我想这样使用它:
<md-icon my-src="cake.svg"></md-icon>
<md-icon my-src="{{ anExpression }}"></md-icon>
<md-icon my-src="{{::onTimeBinding}}"></md-icon>
我也想支持这个,不仅仅是为了 angulat material 使用。
感谢您的帮助!
编辑:
对不起,我没有很好地解释自己。我想支持在各种元素中使用 mySrc 指令。它应该替换为 ng-src 与基本目录。我创建了一个 plunkr 但它不起作用。 到目前为止,代码如下所示:
app.directive("mySrc", function() {
return {
restrict: "A",
compile: function(element, attrs) {
return {
pre: function(scope, element, attributes) {
var baseUrl = 'http://dummyimage.com/';
attributes.$set("ng-src", baseUrl + attributes.mySrc);
}
}
}
}
});
使用示例:
<img my-src="100" />
<img my-src="{{ expr }}" />
<img my-src="{{:: oneTimeExpr }}" />
支持最后两个选项对我们来说也很重要。
您可以在指令实现中执行所需的操作:
var app = angular.module('app', []);
app.directive('mySrc', function ($compile) {
return {
restrict: 'A',
replace: true,
scope: true,
template: '<li><img ng-src="{{ image }}" /></li>',
link: function (scope, element, attrs) {
var baseUrl = 'http://dummyimage.com/';
console.log(attrs);
scope.image = baseUrl + attrs.mySrc;
}
};
});
这是工作plunkr
您的指令确实有效,但您的方法略有偏差。您不想将 my-src
更改为 ng-src
,因为 ng-src
是一个执行与您尝试执行的操作类似的指令。您 实际上 想要做的是将 my-src
更改为 src
,以便浏览器实际呈现标签。
换句话说,attributes.$set("src", baseUrl + attributes.mySrc);
做你想做的事。但是,它不是动态的。
摘自 source for ng-src
,您可以使用 $observe
来监控您的属性变化。
pre: function(scope, element, attributes) {
var baseUrl = 'http://dummyimage.com/';
attributes.$observe("mySrc", function(value) {
attributes.$set("src", baseUrl + attributes.mySrc);
})
}
<button ng-click="expr = '200'">Test dynamic</button>
我刚刚添加了一个快速按钮来测试动态变化。对于 $observe
,只要 mySrc
属性发生变化,src
属性就会更新为新的 URL。