如果您所需要的只是確保該屬性不是可選的,並且它指向作用域上的有效變量,則可以考慮(再次 - 如果您駁回該想法),使用這些屬性與隔離範圍的=
。
所以,你可以與指定所需的範圍變量:
scope: { requiredVar: '=requiredAttribute' },
scopeRequired: [ 'requiredVar' ],
link
是修改行爲的好地方,因爲它涉及的範圍,以及(如果是嵌套在compile
)就可以得到參考到this.scopeRequired
從它。
當然,你可以在每個指令的基礎上做到這一點,但如果你想它作爲全局行爲...這是我用來闖入指令的食譜。
app.config(['$injector', function ($injector) {
var _get = $injector.get;
$injector.get = function patchedGet() {
var provider = _get.apply(this, arguments);
var providerName = arguments[0];
var directiveName = (providerName.match(/(.+)DirectiveProvider$/) || [])[1];
if (directiveName) {
var _$get = provider.$get;
console.log(['hi from injector get', arguments[0], provider.$get]);
provider.$get = function patched$Get() {
var instances = _$get.apply(this, arguments);
console.log(['hi from provider $get', providerName, instances]);
angular.forEach(instances, function(instance) {
function getPatchedPostlink (postlink) {
return function patchedPostlink(scope, element, attrs, ctrls) {
var _postlink = postlink;
console.log(['hi from directive link', directiveName, scope, element, attrs, ctrls]);
// here it goes
if (scope.$$isolateBindings && instance.scopeRequired) {
var bindings = scope.$$isolateBindings;
angular.forEach(instance.scopeRequired, function (scopeVar) {
if (!bindings[scopeVar] || !attrs.hasOwnProperty(bindings[scopeVar].attrName)) {
throw new Error("Scope variable '" + scopeVar + "', required by directive '" + directiveName + "', wasn't assigned!");
}
});
}
return angular.isFunction(_postlink) ? _postlink.apply(this, arguments) : undefined;
};
}
var _compile = instance.compile;
// 'link' is impotent if there is 'compile'
if (_compile) {
instance.compile = function patchedCompile(element, attrs) {
var compile = _compile.apply(instance, arguments);
console.log(['hi from directive compile', directiveName, this, element, attrs]);
if (!compile) {
compile = {};
} else if (angular.isFunction(compile)) {
compile = { post: compile };
}
// compile.pre = getPatchedPrelink(compile.pre);
compile.post = getPatchedPostlink(compile.post);
return compile;
};
} else {
instance.link = getPatchedPostlink(instance.link);
}
}, this);
return instances;
};
}
return provider;
};
}]);
我這樣做了,不過如果我用我的指令,就像'將拋出一個錯誤<我的指令性富=「ctrl.foo」>我的指令性>''時需要bar'和被定義爲隔離範圍的'='?我其實並沒有自己測試... –
我的不好,我沒有仔細閱讀這個問題。不,它不會拋出它,如果你嘗試分配無效範圍變量,它會拋出一個錯誤。我已經更新了答案,希望它有幫助。 – estus
現在這是一個有趣的解決方案:) –