2015-08-16 40 views
1

我正在處理一個角度項目,並使用指令創建一個隔離範圍。該指令是這樣的:將模型綁定到函數調用返回值

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-函數中)來獲得我需要的結果,使其像雙向綁定一樣工作嗎?

謝謝你的幫助。

編輯

getCurrentQuestion - 函數的返回值是一個對象,它看起來像

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

所以沒有什麼特殊的,我希望......

編輯2

當我使用

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

然後在$watch -function我得到

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); 
      }); 
     } 
    }; 
}); 

它的工作原理,但如果你有更新率很高,開銷可能很煩人。我會做的,就是使用一個包含所有問題的服務,並且控制器和指令都可以與之通話。噹噹前問題被改變時,控制器應該只傳遞新指令的id(使用simple @ bind),指令將詢問服務的問題。

+0

+1!我沒有想到自己有另一項服務提供了問題。我會試一下! –

相關問題