2014-11-05 56 views
2

我正在重構一些Angular JS應用程序,並且我將更多地瞭解指令。爲什麼使用控制器進行指令通信而不是服務

我讀過很多次將控制器綁定到指令是一個很好的做法,如果我們想共享邏輯並獲得代碼清潔。

controller綁定到directive以共享許多指令之間的常見任務非常簡單,我瞭解此模式的興趣。但我的問題是爲什麼我們需要使用控制器?

(實施例代碼來自this site

模式1:使用控制器共享指令之間邏輯

綁定一個controllerdirective:與另一指令

app.directive("superhero", function() { 
    return { 
    restrict: "E", 

    controller: function ($scope) { 
     $scope.abilities = []; 

     // [...] additional methods 

     this.addFlight = function() { 
     $scope.abilities.push("flight"); 
     }; 
    }, 

    link: function (scope, element) { 
     element.addClass("button"); 
     element.bind("mouseenter", function() { 
     console.log(scope.abilities); 
     }); 
    } 
    }; 
}); 

共享邏輯:

app.directive("flight", function() { 
    return { 
    require: "superhero", 
    link: function (scope, element, attrs, superheroCtrl) { 
     superheroCtrl.addFlight(); 
    } 
    }; 
}); 

當我想共享我的控制器之間的邏輯時,我創建了一個Factory,我注入到我的控制器中。那麼爲什麼不使用相同的模式?

模式2:使用工廠指令之間共享邏輯

聲明新factory

app.factory("myAwesomeFactory", function() { 
    return { 
     addFlight: function() { /* ... */ } 
    }; 
}); 

使用factorydirective

app.directive("flight", function(myAwesomeFactory) { 
    return { 
     require: "superhero", 
     link: function (scope, element, attrs) { 
      myAwesomeFactory.addFlight(); 
     } 
    }; 
}); 

我無法理解爲什麼第一種方法比第二種方法好。

獎勵問題:爲什麼我們在綁定到指令的控制器中使用this關鍵字?

非常感謝。我發現了很多關於如何將控制器綁定到指令的教程。但沒有人解釋爲什麼我們需要這樣做。

回答

1

我碰到的最大的原因是,由於服務是單身人士,您可能會遇到嚴重問題,因爲多個指令依賴於來自同一服務的邏輯。這就是爲什麼與視圖有關的任何事情都是通過控制器完成的。雖然您有時可能會在指令中使用該服務,但如果可能的話最好避免使用該服務。

相關問題