2015-08-11 4 views
1

мой вопрос на самом деле прост.Использование угловых контроллеров с прототипом

Возможно использование угловых контроллеров с прототипом?

'use strict'; 
var EventController = function(scope, EventModel) { 
    this.scope  = scope; 
    this.EventModel = EventModel; 
}; 

EventController.prototype = { 
    create: function() { 
     this.scope.create = function() { 
      this.EventModel.Model.insert() 
       .then(function(result) { 

       }); 
     }; 
    }, 

    retrieve: function() { 
     var that = this; 

     this.EventModel.Model.find() 
      .then(function(result) { 
       that.scope.events = result; 

      }); 
    }, 

    retrieveOne: function(id) { 
     this.EventModel.Model.findOne(id) 
      .then(function(result) { 
       console.log(result); 

      }); 
    }, 

    update: function() { 
     this.EventModel.Model.update() 
      .then(function(result) { 

      }); 
    }, 

    delete: function() { 
     this.EventModel.Model.remove() 
      .then(function(result) { 

      }); 
    } 
}; 

module.exports = function(adminApp) { 
    adminApp 
     .controller('EventController', ['$scope', 'EventModel', function(scope, EventModel) { 
      return new EventController(scope, EventModel); 

     }]); 
}; 

Я использую Browserify, поэтому у меня есть этот module.exports в финале.

Я хотел бы использовать контроллеры таким образом и получить методы, как если бы это было имя объектов в прототипе.

Есть ли способ, которым я могу это сделать?

ответ

0

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

Магия этого в синтаксисе «Контроллер как», который был введен в Angular 1.2.0.

В демонстрации есть три кнопки. Один использует методы прототипов на самом контроллере, как вы просили, а два других иллюстрируют, что вы можете продолжать использовать контроллер, как вы, вероятно, использовали, используя область действия полностью в разметке и предоставляя методы области в контроллере.

https://jsfiddle.net/scarl3tt/3copx1rk/1/

Javascript

'use strict'; 
var TestController = function(scope) { 
    this.scope  = scope; 
}; 

TestController.prototype = { 
    doAThing: function() { 
     alert('This is a thing'); 
    } 
}; 

angular.module('testApp', []) 
    .controller('TestController', ['$scope', function(scope) { 
     if(typeof(scope.extension) === 'undefined') 
      scope.extension = function() { 
       scope.j *= 2; 
      }; 
     return new TestController(scope); 
    }]); 

Markup

<div ng-app="testApp" ng-controller="TestController as ctrl" ng-init="i = 0; j = 1;"> 
    <h1>Controller as:</h1> 
    <button ng-click="ctrl.doAThing()">Do a thing!</button> 
    <h1>Scope:</h1> 
    <button ng-click="i=i+1">i == {{i}}</button> 
    <h1>Extension method using scope</h1> 
    <button ng-click="extension()">j == {{j}}</button> 
</div> 
+0

Отлично! Могу ли я попросить дополнительную информацию? Как это работало за кулисами? я не понял рамки .j * = 2; –

+0

Это очень надуманный способ проиллюстрировать два момента. Тот факт, что метод работает, показывает, что вы можете добавлять методы области (обратите внимание, что он не вызывается через 'ctrl'). Фактическая строка 'scope.j * = 2;' показывает, что вы можете манипулировать переменными области видимости как обычно (в частности, это умножение 'j' на 2). Ничто из этого не имеет особого отношения к вашему первоначальному вопросу, но просто показывает, что синтаксис «Контроллер как» дает вам гибкость для работы с «областью», как это было до 1.2. Важными компонентами для вас являются 'ng-controller =" TestController как ctrl "и' ng-click = "ctrl.doAThing()" '. – mirichan

+0

Получите это! Благодаря!! –

Смежные вопросы