2017-01-25 5 views
0

У меня есть следующая директива, которая работает правильно, если я не использую ng-if на содержащем элементе. То, что я пытаюсь сделать, - просто установить динамическое свойство в области с ассоциированной функцией. Область не содержит свойство (неопределенное).Директива, не работающая с ng-if

любая помощь была бы замечательной!

app.directive('stRefresh', function() { 
    return { 
     require: '^stTable', 
     link: function (scope, ele, attr, ctrl) { 
      if (attr.stRefresh) { 
       var name = attr.stRefresh; 
       scope[name] = scope[name] || {}; 
       scope[name].refresh = function() { 
        return ctrl.search(); 
       }; 
      } 
     } 
    } 
}); 
+0

Можете ли вы объяснить, что происходит, что неверно – dmoo

+0

область не содержит свойство (неопределенную) – Marco

+0

какой-либо конкретной причине вы используете нг-если для этого, нг-шоу быстрее в целом, и, скорее всего, решить эту проблему – dmoo

ответ

2

Было бы полезно знать, что не работает, но я подозреваю, что вы были укушены the problem of nested scopes.

Директива ng-if создает дочернюю область. Когда вы изменяете область действия в своей директиве:

scope[name] = scope[name] || {}; 

Вы изменяете масштаб ребенка. Благодаря прототипному наследованию это не изменяет рамки родителя. Поэтому, если вы ожидаете увидеть изменение в родительской области, вы не увидите его.

Чтобы исправить это, вам нужно добавить точку в ссылку области. Что-то вроде этого:

scope.data[name] = scope.data[name] || {}; 
scope.data[name].refresh = function() { 
    return ctrl.search(); 
}; 

Свойство scope.data должна быть ссылка на объект. Поскольку вы не изменяете ссылку, вы можете изменить свойства этого объекта как из родительских, так и дочерних областей.

+0

большое спасибо. – Marco