6

The problem I am having is that the loadjs file doesn't always get loaded before I bind it to the grid. I have read other posts regarding using directives but I don't understand how to use them in my case.

The code should load a specific view each view in turn has a specific javascript file that needs to be loaded before the view is finally renered

So view 1 might be a datagrid with datagrid.js file dependancy and view2 is a listview with listview.js dependancy

Thanks.

Function MyCtrl1($scope) {
$scope.$on('$viewContentLoaded', function() {

     //Load file if not already loaded
    isloadjscssfile("js/model/gridmodel.js", "js")


  $("#grid").kendoGrid({
                    dataSource: getdatasource(),
                    pageable: true,
                    height: 400,
                    toolbar: ["create"],
                    columns: [
                        "ProductName",
                        { field: "UnitPrice", title: "Unit Price", format: "{0:c}", width: "150px" },
                        { field: "UnitsInStock", title:"Units In Stock", width: "150px" },
                        { field: "Discontinued", width: "100px" },
                        { command: ["edit", "destroy"], title: " ", width: "210px" }],
                    editable: "inline"
                });
});

}

1

3 Answers 3

3

You can't. Angular does not load javascript parts from a template.

What you should do is to include them in your main application anyway. All of the controllers should be loaded while the main app is initiating. (This is where you put your npApp directive)

Sign up to request clarification or add additional context in comments.

3 Comments

So if I have 20 views instead of being able to dynamically load a js file for each view I have to hardcode src=mygrid.js into my main.html page?? I must be misunderstanding as this would cause each page load to have javascript that is not necessary to that view.
There are other ways to load a javascript file dynamically but this is outside of angular. If you have 20 views it corresponds to 20 controllers, it may be a big file depending on the controller but if you have shared methods check out docs.angularjs.org/guide/dev_guide.mvc.understanding_controller (Section Controller Inheritance). Or you can create a service depending on your needs
ok so in the above example I am loading the file dynamically using the isloadjscssfile which adds the file to the header but using the viewContentLoaded event to to bind to the grid but it doesn't gaurantee the file is loaded. Where in my code should I place the isloadjscssfile("js/model/gridmodel.js", "js") method and where should I place the Bind grid $grid code. It seems that the viewcontentload is to late an event to work correctly. What I need is a place that says if view1 then before doc.ready loadfile then on doc.ready bind to grid
3

Try something like this (it could probably be "more Angular", but for the moment it works for me):

angular.module('MyApp').controller('MyCtrl1', ['$scope', function ($scope) {

    window.initialize = function() {
        // code to execute after your JS file referenced in the loadScript function loads
    }

    var loadScript = function () {
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = 'http://www.myserver.com/file.js?callback=initialize';
        document.body.appendChild(script);
    }

    $scope.$on('$viewContentLoaded', function () {
        loadScript();
    });

}]);

Comments

3

If you want to this in directive, you can do something like this

.directive('require', function(){
    return{
      restrict: 'E',
      scope: {
         scriptSrc: '@'
      },
      template:'<script type="text/javascript" src="{{ scriptSrc }}"></script>',
      link: function(scope, elm, attr){
        ....
      }
      replace: true
    }
});

HTML :

<require script-src="/foo.js">
<require script-src="/bar.js">

1 Comment

It doesn't work, the script is not loaded on time and is not accessible by the controller.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.