2015-08-16 5 views
1

Я работаю над угловым проектом, и я использую директиву для создания изолированного пространства. Директива выглядит следующим образом:Bind model to function call return value

var directive = module.directive('question', function() { 
    return { 
     restrict: 'E', 
     templateUrl: 'question.html', 
     transclude: true, 
     scope: { 
      quiz: '=quiz' 
     }, 
     link: function (scope, attr, element) { 
      scope.$watch(function() { 
       return scope.quiz; 
      }, 
      function (oldVal, newVal) { 
       scope.currentQuestion = scope.quiz; 
      }); 
     } 
    }; 
}); 

Ибо я не хочу, чтобы связать со свойством (или поле) в моем контроллере я создал функцию и вызовите директиву следующим образом:

<question quiz="quiz.getCurrentQuestion()">... (transcluding stuff)</question> 

Пожалуйста обратите внимание, что quiz является моим контроллером, используя as -Syntax.

Способ обработки директивы работает, но мне не нравится создавать двустороннюю привязку (к R-значению?).

Теперь я попытался просто передать функцию, используя & -связывание, но это только показывает нечетные результаты в функции link и разбивает все.

Могу ли я использовать функциональное связывание с помощью & и как-то вызвать функцию (в моем шаблоне или в функции link), чтобы получить результат, мне нужно заставить его работать как двусторонняя привязка?

Благодарим за помощь.

EDIT

Значение возвращение getCurrentQuestion -функции это объект, который выглядит как

{ questionNumber: 1, answers: [], getQuestionText() : function(...), ... }

Так ничего особенного, я надеюсь ...

EDIT 2

Когда я использую

... 
scope: { 
    quiz: '&quiz' 
} 

затем в $watch -функции я

function(locals) { return parentGet(scope, locals); } для scope.quiz

И если я вызываю функцию как scope.quiz() я получаю undefined как результат.

+0

Можете ли вы привести пример ответа quiz.getCurrentQuestion()? –

+0

Вы могли бы создать plunkr? –

+0

@PankajParkar Извините, нет, я не должен, это производственный код, и я прошу только за любопытство ... –

ответ

1

Не удалось найти способ просмотра функции в привязке по сфере. Однако есть и другие решения. Если вы хотите, единственный способ связывания вы можете использовать «@», но это означает, что вам придется разобрать JSON в часах ( working example):

var directive = module.directive('question', function() { 
    return { 
     restrict: 'E', 
     templateUrl: 'question.html', 
     transclude: true, 
     scope: { 
      quiz: '@' 
     }, 
     link: function (scope, attr, element) { 
      scope.$watch('quiz', function (newVal, oldVal) { 
       scope.currentQuestion = angular.fromJson(newVal); 
      }); 
     } 
    }; 
}); 

Это работает, но если у вас есть высокая скорость обновления , накладные расходы могут быть раздражающими. То, что я хотел бы сделать, - это использовать службу, которая содержит все вопросы, и как контроллер, так и директива могут разговаривать. Когда текущий вопрос изменен, контроллер должен передать директиве только идентификатор нового вопроса (используя simple @ bind), и директива будет запрашивать сервис для вопроса.

+0

+1 за идею! Я не считал, что мне нужна еще одна услуга. Я дам ему попробовать! –