Я пытаюсь создать функцию в пределах угловой директивы, которая должна просто изменить значение объекта.
Он не будет работать с передачей переменной непосредственно функции:
<body ng-controller="MainCtrl">
<div test ng-click="changeVar(variable.value)">{{ variable.value }}</div>
</body>
app.directive('test', [function(){
return {
link: function(scope, elem, attrs) {
scope.variable = {
value : "bla"
};
scope.changeVar = function(value) {
value = "hhuhu"
};
}
}
}]);
Но передача родительского объекта:
<body ng-controller="MainCtrl">
<div test ng-click="changeObj(variable)">{{ variable.value }}</div>
</body>
app.directive('test', [function(){
return {
link: function(scope, elem, attrs) {
scope.variable = {
value : "bla"
};
scope.changeObj = function(obj) {
obj.value = "hhuhu"
};
}
}
}]);
Почему мне нужно передать родительский объект в функцию для перезаписывания значения и не может передать значение напрямую, чтобы перезаписать его? Я что-то упускаю?
Я думаю, что здесь вам не хватает понятия о облаках в angularjs и о том, как они передаются.
когда вы объявляете свою директиву так:
app.directive('parent', [function(){
return {
controller: function($scope) {
$scope.variable = {};
// init
$scope.variable.value = "foo";
}
}
}]);
app.directive('child', [function(){
return {
controller: function($scope) {
// here you are directly using the parent scope
// so you can access $scope.variable directly
// without sending it in the function
$scope.changeObj = function(replacement) {
$scope.variable.value = replacement ;
};
}
}
}]);
вы в основном говорите угловатым, чтобы использовать родительскую область как область видимости, потому что вы не определяете особую область своей директивы.
(кстати, такого рода операции:
scope.changeObj = function(obj) {
obj.value = "hhuhu"
};
не должно быть в функции связи, но в контроллере для меня это выглядит как логика контроллера:)
Второе, что вы можете сделать, это отправить переменную через параметр в область дочернего объекта следующим образом:
app.directive('parent', [function(){
return {
controller: function($scope) {
$scope.variable = {};
// init
$scope.variable.value = "foo";
}
}
}]);
app.directive('child', [function(){
return {
scope:{myVariable: '='},
controller: function($scope) {
// here you are directly using the child scope
// but since you have defined double binding,
// changing this in the child will also update the parent
$scope.changeObj = function(replacement) {
$scope.myVariable.value = replacement ;
};
}
}
}]);
<body ng-controller="MainCtrl">
<div test my-variable="variable" ng-click="changeObj('some text')">{{ variable.value }}</div>
</body>
Надеюсь, теперь ясно